Entity Framework 4 перезаписывает Equals и GetHashCode свойства собственного класса - PullRequest
4 голосов
/ 11 июня 2010

Я использую Visual Studio 2010 с .NET 4 и Entity Framework 4. Я работаю с классами POCO, а не с генератором EF4. Мне нужно переопределить методы Equals() и GetHashCode(), но это на самом деле не работает. Я думал, что это то, что все делают, но я не нахожу ничего о проблеме в Интернете.

Когда я пишу свои собственные классы и метод Equals, я использую Equals() свойств, которые должны быть загружены EF для заполнения. Как это:

public class Item
{
    public virtual int Id { get; set; }
    public virtual String Name { get; set; }

    public virtual List<UserItem> UserItems { get; set; }
    public virtual ItemType ItemType { get; set; }

    public override bool Equals(object obj)
    {
        Item item = obj as Item;
        if (obj == null)
        {
            return false;
        }

        return item.Name.Equals(this.Name)
            && item.ItemType.Equals(this.ItemType);
    }

    public override int GetHashCode()
    {
        return this.Name.GetHashCode() ^ this.ItemType.GetHashCode();
    }
}

Этот код не работает. Проблемы в Equals и GetHashCode, где я пытаюсь получить HashCode или Equal из ItemType. Каждый раз, когда я пытаюсь получить данные с помощью Linq2Entites, я получаю исключение NullRefernceException.

Грязный способ исправить это - перехватить NullReferenceException и вернуть false (по Equals) и вернуть base.GetHashCode() (по GethashCode), но я надеюсь, что есть лучший способ исправить эту проблему.

Я написал небольшой тестовый проект с SQL Script для БД и домена POCO, EDMX File и Console Test Main Method. Вы можете скачать это здесь: Скачать

1 Ответ

0 голосов
/ 11 июня 2010

Вы используете чистые классы POCO без генерации прокси.В этом случае отложенная загрузка не поддерживается, и вам придется создавать методы репозитория для загрузки связанных сущностей самостоятельно.Вот почему ваша сущность ItemType равна нулю (и всегда будет).

Если вы хотите отложенной загрузки, вы можете использовать генератор EF для создания классов POCO, поддерживающих отложенную загрузку.

...