我知道有一种Load
方法。
_dbContext.Entry(blog).Collection(b => b.Posts).Load()
但是我正在尝试处理并发冲突,我已经在post
中添加了blog.Posts
。如果调用Load
,则不会清除blog.Posts
,只需将现有的Posts
附加到其上即可。
我尝试过:
blog.Posts = null;
_dbContext.Entry(blog).Collection(b => b.Posts).Load()
但是blog.Posts
变成一个空集合(零计数)。
所以我要一个Reload
。
答案 0 :(得分:3)
不幸的是,尽管EntityEntry
具有Reload
方法,但是ReferenceEntry
和CollectionEntry
并没有这样的方法(或者一般来说,NavigationEntry
的基础是前两个)。并且Reload
方法仅刷新原始属性,因此不能用于刷新导航属性。
幸运的是,创建自定义按钮并不难。它需要分离(或重新加载?)所有当前的收集项,在调用IsLoaded
之前将false
设置为CurrentValue
,将null
设置为Load
。
这样的事情(将其放入您选择的静态类中并添加必要的using
s)
public static void Reload(this CollectionEntry source)
{
if (source.CurrentValue != null)
{
foreach (var item in source.CurrentValue)
source.EntityEntry.Context.Entry(item).State = EntityState.Detached;
source.CurrentValue = null;
}
source.IsLoaded = false;
source.Load();
}
因此您可以使用所需的
_dbContext.Entry(blog).Collection(b => b.Posts).Reload();