C# 核心实体平等

C# 核心实体平等,c#,entity-framework,entity-framework-core,C#,Entity Framework,Entity Framework Core,抱歉,如果这是一个愚蠢的问题,我对ORMs的大部分体验都不是EF,在网上查找这个问题会给我带来很多负面影响。就像“参考”对不同的人意味着不同的东西 如果我这样编写代码: using (var db = new DbContext()) { var entity1 = await db.Foos.FirstOrDefaultAsync(x => x.Id == 1); var entity2 = await db.Foos.FirstOrDefaultAsync(x =>

抱歉,如果这是一个愚蠢的问题,我对ORMs的大部分体验都不是EF,在网上查找这个问题会给我带来很多负面影响。就像“参考”对不同的人意味着不同的东西

如果我这样编写代码:

using (var db = new DbContext())
{
    var entity1 = await db.Foos.FirstOrDefaultAsync(x => x.Id == 1);
    var entity2 = await db.Foos.FirstOrDefaultAsync(x => x.Id == 1);
    return entity1.Equals(entity2);
}
这将返回
true
。因为我的实体是引用类型,所以引擎盖下的
Equals
应该是
对象。ReferenceEquals()
调用


我想知道的是,这是否可靠,也就是说,上下文中由特定数据库记录表示的任何实体在引用上是否总是相等的,或者它是否可以“退出”缓存,按需重新加载,并拥有一个新的引用,就像在一些不太复杂的ORM中发生的那样?如果一个实体作为集合的一部分加载到另一个实体上,它仍然是同一个对象吗?是否存在控制此行为的规则/设置?

正如@IvanStoev在评论中指出的,引用一致性是设计的,是EF的核心部分,因此数据库中的同一对象应始终引用数据库上下文中的同一对象。。。至少在您所处的特定数据库上下文的范围内。YMMV如果您处理的是多个数据库上下文。

当您使用
查找
时,会发生3件事情,按优先级顺序排列:1)EF在本地缓存中查找对象,2)EF在添加的对象中查找,3)EF从数据库加载数据。除非这是有文档记录的行为(我认为不是),否则我不会依赖它。有人总是可以覆盖
等于
。@JohnyL我想应该是这样的,但是本地缓存有多健壮?它是否一定会在数据库上下文的整个生命周期中持续,它会一直保持到需要空间,还是直到感觉记录过时?如果我关心唯一性的话,我想知道它有多可靠。除此之外,它是有保证的(尽管我找不到文档)。事实上,它是接收“具有相同密钥的另一个实体已被上下文跟踪”异常的许多问题的根源。此外,EF确实为跟踪强制引用相等,因此即使对象覆盖
相等
,它们仍然检测相等的引用,而不是自定义相等。或者以您为例,他们在内部总是使用
ReferenceEquals(entity1,entity2)
而不是
entity1.Equals(entity2)
。我错过了EF核心标记。我在前面的评论中所写的一切仍然适用。这在中有点解释-注意,无跟踪查询中的单词identity仍然在执行查询中执行标识解析。