Entity Framework Core (ошибка?) — проблема при переопределении Equals в сущности.C#

Место общения программистов C#
Ответить
Anonymous
 Entity Framework Core (ошибка?) — проблема при переопределении Equals в сущности.

Сообщение Anonymous »

Я использую 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 только при наличии включения. Свойство навигации представляет собой список с дженериками.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»