Я использую Entity Framework Core 2.1 и столкнулся со странной ситуацией. У меня есть несколько строк с одинаковыми значениями для некоторых столбцов, но с разными идентификаторами в БД. Когда я извлекаю их с помощью 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 строки в базе данных с разными идентификаторами и разными значениями IsActive, но с одинаковым именем, они вернут только одну строку, потому что EF вызовет метод Equals и скажет: «Эй, эти 2 строки одинаковы, так что давайте сохраним одну». На мой взгляд, это ошибка, поскольку он также должен вызывать GetHashCode. Как правило, каждый раз, когда вы переопределяете Equals, вам нужно переопределять GetHashCode, и это один из вариантов использования.
Эта проблема случалась со мной, когда я делал включение, возможно, EF вызывает Equals только при наличии включения. Свойство навигации представляет собой список с дженериками.