如何在EF Core 2.x中重新加载集合?

时间:2019-07-16 15:05:02

标签: c# entity-framework-core ef-core-2.2

我知道有一种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

1 个答案:

答案 0 :(得分:3)

不幸的是,尽管EntityEntry具有Reload方法,但是ReferenceEntryCollectionEntry并没有这样的方法(或者一般来说,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();