实体框架 - GetHashCode中的Child对象为null

时间:2015-03-19 08:01:58

标签: c# asp.net-mvc entity-framework

EntityFramework6 MVC5

我是EF和MVC的新手,我的方案是我有一个覆盖Equals和GetHashCode的类:

EF代码:

public partial class ProdCategory
{
    public long ProdID { get; set; }
    public int CategoryID { get; set; }
    public bool PermanentlyDelete { get; set; }
    public System.DateTime DateCreated { get; set; }

    public virtual Category Category { get; set; }
    public virtual Product Product { get; set; }
}

我的代码:

    public override bool Equals(object obj)
    {
        if (obj == null | (!object.ReferenceEquals(this.GetType(), obj.GetType())))
        {
            return false;
        }

        ProdCategory p = (ProdCategory)obj;

        if (this.Category == p.Category && this.Product == p.Product)
        {
            return true;
        }

        return false;
    }
    public override int GetHashCode()
    {
        unchecked
        {                
            var result = 0;
            result = (result * 397).GetHashCode() ^ this.Product.GetHashCode();
            result = (result * 397).GetHashCode() ^ this.Category.GetHashCode();
            return result;
        }
    }

此类成为产品的子对象,当我转到产品列表时,查看GetHashCode错误

  

Heisenberg.dll中发生了'System.NullReferenceException'类型的异常但未在用户代码中处理

我认为它可能是一个延迟加载问题但是Product对象存在于GetHashCode函数中,所以我假设那里有那个,Category应该是......?我尝试使用以下方法强制加载prodCategory:

var products = db.Products.Include(p => p.ProdCategories);

但它没有任何区别。那么我虽然我需要强制加载ProdCategory中的类别,但我无法解决这个问题的语法。

作为测试,我注释掉了GetHashCode函数 - 页面加载正常,我可以转到产品的详细信息视图并查看prodCategory详细信息,因此它会在某些时候填充。这就是抛出我的东西!不知道还有什么可以尝试?

我希望有人能看到我出错的地方。

更新: 如果我在GetHashCode中设置了一个断点 - 第一次命中它,就会填充Product,Category为null。如果我没有运行“类别”行并继续,则会再次触发断点。这次填充了产品和类别。

任何人都可以了解发生的事情以及行动的目的是什么?我可以检查GetHashCode中是否为null,但它确实应该永远不会为null,我只是隐藏错误。

1 个答案:

答案 0 :(得分:2)

无论如何,你应该根据外键做GetHashCode

public override int GetHashCode()
{
    unchecked
    {                
        var result = this.ProdID.GetHashCode();
        result = (result * 397) ^ this.CategoryID;
        return result;
    }
}

外部id永远不会被设置(假设该项目是"从数据库获得#34;这是因为外部ID在行本身上(因此不需要连接)。为了解决当你第一次实例化对象时HashCode出错的问题,我会这样做。

public partial class ProdCategory
{
    protected ProdCategory() {} //protected default constructor is required by EF

    public ProdCategory(Category category, Product product)
    {
        this.Category = category;
        this.Product = product;
        this.ProdID = product.Id;
        this.CategoryID = category.Id;
    }

    public long ProdID { get; protected set; }
    public int CategoryID { get; protected set; }
    public bool PermanentlyDelete { get; set; }
    public System.DateTime DateCreated { get; set; }

    public virtual Category Category { get; protected set; }
    public virtual Product Product { get; protected set; }
}