C# 如何在EF Core 2.x中重新加载集合?
我知道有一种加载方法C# 如何在EF Core 2.x中重新加载集合?,c#,entity-framework-core,ef-core-2.2,C#,Entity Framework Core,Ef Core 2.2,我知道有一种加载方法 \u 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变成了一个空集合(零计数) 因此,
\u 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
变成了一个空集合(零计数)
因此,我想要一个
重新加载
,不幸的是,尽管EntityEntry
有重新加载
方法,但对于引用条目
和集合entry
(或者一般来说,对于作为前两个基础的导航entry
),没有这样的方法。而Reload
方法只刷新原语属性,因此不能用于刷新导航属性
幸运的是,创建一个定制的并不难。它需要分离(或重新加载?)所有当前集合项,在调用Load
之前,将IsLoaded
设置为false
,将CurrentValue
设置为null
类似这样的内容(将其放入您选择的静态类中,并使用s添加必要的):
因此,您可以使用所需的
_dbContext.Entry(blog).Collection(b => b.Posts).Reload();
您的基本问题似乎是试图以多线程方式使用DbContext
。每个线程都应该有自己的DbContext
as实例。@SixtoSaez不,我保证它不是多线程的。DbContext来自DI。我只是使用Class.Method来描述哪个类的实例并调用哪个方法。为了澄清这个问题,我将DbContext改为_DbContext。是否需要分离赋值?如果我只设置source.CurrentValue=null代码>然后设置source.IsLoaded=false
和source.Load()代码>,安全吗?不安全。我的测试表明所有这些都是必要的。不分离项目您将获得缓存的项目,而不是数据库中的新项目,以及添加的项目,但不是删除的项目。@IvanStoev这对我不起作用。如果您有时间,请查看此处:
_dbContext.Entry(blog).Collection(b => b.Posts).Reload();