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

Jok*_*ang 3 c# entity-framework-core ef-core-2.2

我知道有一个Load方法。

_dbContext.Entry(blog).Collection(b => b.Posts).Load()
Run Code Online (Sandbox Code Playgroud)

但我试图处理并发冲突,我已经加一postblog.Posts。如果调用Load,它不会清除blog.Posts,只需将现有附加Posts到它。

我曾尝试:

blog.Posts = null;
_dbContext.Entry(blog).Collection(b => b.Posts).Load()
Run Code Online (Sandbox Code Playgroud)

blog.Posts成为一个空集合(零计数)。

所以我想要一个Reload.

Iva*_*oev 6

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

幸运的是,创建一个自定义的并不难。它需要分离(或重装?)所有当前收集的物品,设置IsLoadedfalseCurrentValuenull之前调用Load

像这样的东西(将它放在您选择的静态类中并添加必要的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();
}
Run Code Online (Sandbox Code Playgroud)

所以你可以使用所需的

_dbContext.Entry(blog).Collection(b => b.Posts).Reload();
Run Code Online (Sandbox Code Playgroud)

  • 没有。我的测试表明所有这些都是必要的。如果不分离项目,您将获得缓存的项目,而不是数据库中的新鲜项目以及添加的项目但不是删除的项目。 (2认同)