gpt4 book ai didi

c# - 将 EF6 重构为 EF Core

转载 作者:太空宇宙 更新时间:2023-11-03 12:42:25 24 4
gpt4 key购买 nike

我一直在尝试将一些 EF6 代码重构为 EF Core 1,但遇到了一个小绊脚石。我试图转换的代码在这里:

https://github.com/mehdime/DbContextScope

一切都很好,但事实证明 DbContextScope.cs 尤其棘手,例如此方法(为简洁起见进行了编辑):

        public void RefreshEntitiesInParentScope(IEnumerable entities)
{
foreach (IObjectContextAdapter contextInCurrentScope in
_dbContexts.InitializedDbContexts.Values)
{
var correspondingParentContext =
_parentScope._dbContexts.InitializedDbContexts.Values
.SingleOrDefault(parentContext =>
parentContext.GetType() == contextInCurrentScope.GetType())
as IObjectContextAdapter;

if (correspondingParentContext == null)
continue;

foreach (var toRefresh in entities)
{
ObjectStateEntry stateInCurrentScope;
if (contextInCurrentScope.ObjectContext.ObjectStateManager
.TryGetObjectStateEntry(toRefresh, out stateInCurrentScope))
{
var key = stateInCurrentScope.EntityKey;

ObjectStateEntry stateInParentScope;
if (correspondingParentContext.ObjectContext.ObjectStateManager
.TryGetObjectStateEntry(key, out stateInParentScope))
{
if (stateInParentScope.State == EntityState.Unchanged)
{
correspondingParentContext.ObjectContext.Refresh(
RefreshMode.StoreWins, stateInParentScope.Entity);
}
}
}
}
}
}

问题。

首先,我知道我可以用新的 ChangeTracker 替换 ObjectContext.ObjectStateManager,但我想确保我获得的条目是正确获取的。在 EF Core 中如何翻译以下行?

contextInCurrentScope.ObjectContext.ObjectStateManager
.TryGetObjectStateEntry(toRefresh, out stateInCurrentScope)

其次,这在 EF Core 中的等价物是什么?

correspondingParentContext.ObjectContext.Refresh

谢谢!

附言上面 GitHub 存储库的源代码中有很多有用的评论。

最佳答案

我认为获取实体条目及其键和状态的正确方法是:

var entry = contextInCurrentScope.Entry(toRefresh);
var keys = entry.Metadata.GetKeys();
var state = entry.State;

您还可以使用如下条目从数据库中刷新单个实体:

entry.Reload();

关于c# - 将 EF6 重构为 EF Core,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38446751/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com