实体框架核心(错误?)-覆盖实体中的相等问题

时间:2018-08-16 19:54:36

标签: entity-framework-core equals

我正在使用Entity Framework Core 2.1,并且遇到了一种奇怪的情况。我有一堆行,某些列的值相同,但数据库中的ID不同。当我使用EF Core检索它们时,只有那些具有不同值的对象才绑定到对象(例如,我在数据库中有17个满足条件的行,而我只有7个对象)。我的实体正在覆盖Equals方法,因此我在该方法上添加了一个断点,并验证了EF正在调用它。

EF仅基于Equals方法检索“唯一”行,而对于我而言,这是一个问题,因为我保留的IsActive列不属于Equals方法。同时,我的实体正在覆盖GetHashCode方法,但EF未使用它。我认为这是一个错误。

是否有一种方法可以解决此问题而无需将IsActive添加到Equals方法中?

让我展示代码的模拟版本:

public class EntityX 
{
     public int Id {get;set;}
     public string Name {get;set;}
     public bool IsActive {get;set;}

     public override bool Equals(object obj)
     {
          // return true when the Name properties are the same. it's not considering IsActive property
          ...
     }

     public override int GetHashCode()
     {
          return Id.GetHashCode();
     }
}

如果数据库中有2行具有不同的ID和不同的IsActive值但名称相同,则它将仅返回一行,因为EF将调用Equals方法并说“嘿,这两行是相同的,因此让我们保留一个”。。我认为这是一个错误,因为它也应该调用GetHashCode。根据经验,每次重写Equals时,都必须重写GetHashCode,这是其中的用例之一。

当我进行包含时,此问题发生在我身上,也许EF仅在包含时才调用“等于”。导航属性是带有泛型的列表。

0 个答案:

没有答案