4

我正在使用带有 .NET 4 和 Entity Framework 4 的 Visual Studio 2010。我正在使用 POCO 类而不是 EF4 生成器。我需要重写Equals()andGetHashCode()方法,但这并没有真正起作用。我认为这是每个人都会做的事情,但我在网上找不到任何关于这个问题的信息。

当我编写自己的类和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或从哪里得到。每次,如果我尝试通过 Linq2Entites 获取数据,我都会收到 NullRefernceException。GetHashCodeHashCodeEqualItemType

修复它的一种肮脏方法是捕获 NullReferenceException 并返回false(通过 Equals)并返回base.GetHashCode()(通过GethashCode),但我希望有更好的方法来解决这个问题。

我编写了一个小测试项目,其中包含用于 DB 和 POCO 域的 SQL 脚本、EDMX 文件和控制台测试主要方法。你可以在这里下载: 下载

4

1 回答 1

0

您正在使用没有代理生成的纯 POCO 类。在这种情况下,不支持延迟加载,您必须自己创建存储库方法来加载相关实体。这就是为什么您的ItemType实体为空(并且永远是)的原因。

如果要延迟加载,可以使用 EF 生成器构建支持延迟加载的 POCO 类。

于 2010-06-11T06:58:49.347 回答