我正在使用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仅在包含时才调用“等于”。导航属性是带有泛型的列表。