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,我只是隐藏错误。
答案 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; }
}