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

How to reload collection in EF Core 2.x?

我知道有一个Load方法。

_dbContext.Entry(blog).Collection(b => b.Posts).Load()

但是我试图处理并发冲突,我已经在 blog.Posts 中添加了一个 post。如果调用 Load,它不会清除 blog.Posts,只是将现有的 Posts 添加到它。

我试过:

blog.Posts = null;
_dbContext.Entry(blog).Collection(b => b.Posts).Load()

但是blog.Posts变成了一个空集合(零计数)。

所以我想要一个 Reload.

不幸的是,虽然 EntityEntryReload 方法,但 ReferenceEntryCollectionEntry 没有这样的方法(或者一般来说,NavigationEntry前两个的基础)。 Reload 方法仅刷新原始属性,因此不能用于刷新导航属性。

幸运的是,创建自定义的并不难。它需要分离(或重新加载?)所有当前集合项,在调用 Load.[=24 之前将 IsLoaded 设置为 false 并将 CurrentValue 设置为 null =]

类似这样的内容(将其放入您选择的静态 class 并添加必要的 usings):

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();