【发布时间】:2015-03-20 14:58:24
【问题描述】:
实体框架6 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”类型的异常,但未在用户代码中处理
我认为这可能是延迟加载问题,但 GetHashCode 函数中存在 Product 对象,所以我假设如果存在,Category 应该是..?我尝试使用以下命令强制加载 prodCategory:
var products = db.Products.Include(p => p.ProdCategories);
但这并没有什么不同。因此,虽然我需要强制在 ProdCategory 中加载类别,但我无法为此制定语法。
作为测试,我注释掉了 GetHashCode 函数 - 页面加载正常,我可以转到产品的详细信息视图并查看 prodCategory 详细信息,因此它确实会在某些时候填充。这就是让我失望的原因!不知道还能尝试什么?
我希望有人能看出我哪里出错了。
更新: 如果我在 GetHashCode 中设置断点 - 第一次遇到它时,Product 已填充,Category 为空。如果我不运行 Category 行并继续,则会再次遇到断点。这次同时填充了产品和类别。
谁能阐明正在发生的事情以及最佳行动方案是什么?我可以检查 GetHashCode 中是否为 null,但它真的不应该为 null,我只是隐藏错误。
【问题讨论】:
-
ProdCategory是做什么的?它看起来只是一个关联,在这种情况下,它不应该存在于您的域模型中。 -
它包含其他属性,例如 MarkForDeletion
-
第一个问题是:为什么需要Hashcode?您只能将它用于内存中的对象,而不能用于针对数据库的 LINQ 查询,而我认为它是在 LINQ 查询中进行排序和比较的。
-
嗨,我正在从一个 winforms 项目中移动所有这些代码。在该项目中创建覆盖的 equals 时,我被告知您应该始终更改 GetHasCode 函数以匹配,因为“Equal”对象应该始终具有相同的哈希码。
-
好吧,那么问题又回到了:为什么需要覆盖 Equals?是否有任何代码显式或隐式需要比较
ProdCategory实例(隐式使用例如具有Dictionary<ProdCategory,ValueType>>)。
标签: c# asp.net-mvc entity-framework