Skip to main content
 首页 » 编程设计

c#之如何在 EF Core 2.x 中重新加载集合

2024年02月25日33www_RR

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

请您参考如下方法:

不幸的是,虽然 EntityEntry 有 Reload 方法,但是 ReferenceEntry 和 CollectionEntry 没有这样的方法(或者在一般而言,NavigationEntry 是前两者的基础)。而 Reload 方法仅刷新原始属性,因此不能用于刷新导航属性。

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

像这样(把它放在你选择的静态类中并添加必要的 using):

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