gpt4 book ai didi

c# - 刷新 Entity Framework 中的延迟加载关系

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

我正试图找到一种方法来在我的 EF 实体被另一个上下文修改后刷新它们。一切正常,除了未更新的导航属性。

更改后我都试过了:

var objectContext = ((IObjectContextAdapter)context).ObjectContext;
objectContext.Refresh(RefreshMode.ClientWins, entity);

和:

context.Entry(entity).Reload();

但两者都不会导致关系更新。这是代码优先模型(删除了一些内容):

public class ElementType : IElementType
{
[Key]
public Guid ID { get; set; } = Guid.NewGuid();

public virtual List<Element> Elements { get; set; }
}

public class ElementType : IElementType
{
[Key]
public Guid ID { get; set; } = Guid.NewGuid();

public virtual ElementType ElementType { get; set; }
}

我正在添加一个新元素,刷新并没有更新 ElementType 中的元素关系属性。我知道其他上下文正在更新内容,因为当我关闭所有内容并重新启动它时,一切看起来都符合我的预期。

上下文仍然连接,因为我可以从数据库上下文中获取新实体。我什至可以通过导航到新元素,检查它的关系属性(然后触发 ElementType 更新)来强制 ElementType 在调试器中更新它的 Element 集合:

所以在上面的更新方法之后它是0: enter image description here

如果我导航到调试器中的上下文,检查元素集,新元素存在,并且关系属性设置正确(并引用相同的 Proxy ElementType 对象)。所以这是 DBContext 的元素集合:

enter image description here

现在回到原来的元素:

enter image description here

一切都是最新的!

所以我很确定除 Refresh/Update 方法外一切正常。 This question here建议 Reload 应该适用于延迟加载的关系,而且我似乎无法找到有关如何实际刷新此集合的任何进一步信息。有人知道为什么它没有像我预期的那样工作吗?

最佳答案

感谢 Cristian Szpisjak 为我指明了 DbEntityEntry 的 Collection 方法的方向。

我写了一个通用方法来刷新我的收藏:

    public void Refresh(object entity)
{
DbEntityEntry entry = context.Entry(entity);
entry.Reload();

var values = entity.GetType().BaseType
.GetProperties()
.Where(propertyInfo => propertyInfo.GetCustomAttributes(typeof(ReloadCollectionOnRefresh), false).Count() > 0)
.Select(propertyInfo => propertyInfo.Name);

foreach (string value in values)
{
var collection = entry.Collection(value);
collection?.Load();
}
}

其中集合属性标记有 ReloadCollectionOnRefresh 自定义属性:

    [ReloadCollectionOnRefresh]
public virtual List<MyEntity> MyEntities{ get; set; }

这只是一个非常空的属性来“标记”集合:

[AttributeUsage(AttributeTargets.Property)]
class ReloadCollectionOnRefresh : Attribute
{
// can we add checking that this is applied to a virtual collection?
}

关于c# - 刷新 Entity Framework 中的延迟加载关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43113227/

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