如何在 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
.
不幸的是,虽然 EntityEntry
有 Reload
方法,但 ReferenceEntry
和 CollectionEntry
没有这样的方法(或者一般来说,NavigationEntry
前两个的基础)。 Reload
方法仅刷新原始属性,因此不能用于刷新导航属性。
幸运的是,创建自定义的并不难。它需要分离(或重新加载?)所有当前集合项,在调用 Load
.[=24 之前将 IsLoaded
设置为 false
并将 CurrentValue
设置为 null
=]
类似这样的内容(将其放入您选择的静态 class 并添加必要的 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();
我知道有一个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
.
不幸的是,虽然 EntityEntry
有 Reload
方法,但 ReferenceEntry
和 CollectionEntry
没有这样的方法(或者一般来说,NavigationEntry
前两个的基础)。 Reload
方法仅刷新原始属性,因此不能用于刷新导航属性。
幸运的是,创建自定义的并不难。它需要分离(或重新加载?)所有当前集合项,在调用 Load
.[=24 之前将 IsLoaded
设置为 false
并将 CurrentValue
设置为 null
=]
类似这样的内容(将其放入您选择的静态 class 并添加必要的 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();