查询未返回实体

Entity not returned from query

我遇到这个问题,我有 2 个实体通过外键连接。

我用 SaveChanges() 将它们都保存到数据库中,稍后当我尝试获取 AEntityidOfEntityB 时,我成功了,但是当我尝试获取 [=14] =] 根据我从 AEntity 得到的 id,我什么也没得到:

context.AEntities.Add(new AEntity {
   BEntity = new BEntity { ... }
});
context.SaveChanges();
. 
. 
. 
var id1 = context.AEntities.Select(x => x.idOfEntityB);
var bEntities = context.BEntities.Where(x => id1.Contains(x.id));

bEntities里面什么都没有。但我能够在 id1 中拥有值的事实更加令人困惑,因为它们具有外键关系(有约束)而且,如果没有保存到数据库,则无法创建 id。

稍后,当我查看数据库时,我看到了两个实体。

它有时会发生,我无法重现问题,我不能给出更多的例子,因为有很多代码,我相信它与缓存有关,因此想问一下是否有类似的东西这可能与否以及如何实现。

is there a way entities are saved to the DB while the context (a different one used from the context that saved) does not hold all of them in completion?

如果您依赖于查看不同 DbContext 实例之间的状态变化之间的变化,这可能是您遇到的问题。当一个 DbContext 加载实体时,另一个 DbContext 实例对这些记录进行更改,或者记录在数据库中的幕后更改,原始 DbContext 将不会刷新数据库中的实体。

EF 确实支持从数据库重新加载实体的能力,但是在处理子集合时,执行完全刷新会变得有点复杂。您实际上需要告诉 DbContext 忘记所有子集合,停止跟踪父集合,清除父集合的子集合,然后重新附加并重新加载子集合。我最近在这个问题的答案中提到了这一点:Replacing a entity collection in Entity Framework Core causes DbContext to fetch the new values when not saved to db. How to reload the collection?

最终,DbContext 的生命周期应尽可能短。