Я хочу сравнить записи, чтобы увидеть, есть ли различия между ними.IEquatable прерывает загрузку объектов Entity Framework
Person
стол:
ID Name Address
--------------------------------
1 John Smith 123 A Street
2 John Smith 123 A Street
3 John Smith 234 B Street
Записи 1 и 2 "равны". Записи 2 и 3 «не равны».
Я внедрил IEquatable
на модель Person
следующим образом.
public static bool operator ==(Person p1, Person p2)
{
if (System.Object.ReferenceEquals(p1, p2)) return true;
return p1.Equals(p2);
}
public static bool operator !=(Person p1, Person p2)
{
return !(p1== p2);
}
public bool Equals(Person other)
{
if (System.Object.ReferenceEquals(this, other)) return true;
if (Name != other.Name) return false;
if (Address != other.Address) return false;
return true;
}
public override bool Equals(object obj)
{
Person person = obj as Person;
if (person == null) return false;
return Equals(person);
}
public override int GetHashCode()
{
unchecked
{
int hash = (int)2166136261;
hash = hash * 25165843^(Name != null ? Name .GetHashCode() : 0);
hash = hash * 25165843^(Address != null ? Address.GetHashCode() : 0);
return hash;
}
}
Вопрос заключается в том, что когда Persons
ICollection от навигационного имущества материализуется. В нем отсутствуют записи, «равные» друг другу (т. Е. Возвращается одна запись John Smith 123 A Street). Я предполагаю, что это связано с тем, что по умолчанию он рассматривает разные объекты, имеющие уникальные первичные ключи. Переопределяя равные значения, он считает, что обе записи являются одной и той же сущностью.
Скриншот показывает Addresses
вместо Persons
: (верх с IEquatable
, дно без)
//Addresses Definition (generated code)
public virtual ICollection<Address> Addresses { get; set; }
Как примирить EF нуждаясь видеть равенство на уровне объекта против меня, желая, чтобы увидеть логическое равенство?
Можете ли вы показать объявление свойства 'Addresses' на' EmployeeElection'? –
@CharlesMager Конечно, я добавил его под скриншотом. Это часть генерируемого кода EF. – Shoe
Установили ли вы это как новый Hashset
() 'в конструкторе?Это часто случается в образцах EF. Кроме того, ключевое слово 'virtual' допускает ленивую загрузку, созданный прокси EF может использовать' ISet '(я не знаю специфики!). Множество семантики означает, что дубликаты не могут быть добавлены, и по умолчанию они будут использовать сопоставитель по умолчанию по умолчанию (так что ваш 'Equals' переопределить). Поэтому, хотя запрос может возвращать дубликаты, модель/EF их не покажет. –