0

我想使用“等于”来检查我的数据库中的一个值是否与另一个给定值相同。不幸的是,NHbernate 不支持“Equals”,所以我在互联网上搜索并找到了这个教程: http: //www.primordialcode.com/blog/post/nhibernate-3-extending-linq-provider-fix-notsupportedexception
最后,我必须注册扩展 - 但我应该在哪个文件中注册?

编辑
也许我应该更好地描述我的问题......
情况:我有一个名为“GoodsType”的枚举。可能的值例如是“Iron”、“Wood”、“Stone”等。这个枚举用于“InventoryGoods”类中:

public class InventoryGoods: Goods
{
    public virtual User Owner { get; set; }
    public virtual Guid Id { get; set; }
    public virtual long Amount { get; set; }
    public virtual GoodsType GoodsType { get; set; }
    public virtual float Price { get; set; }
}

如果用户想卖东西,我必须检查他是否有足够的这种特定商品。我为此检查创建了一个函数。这个函数能够自己找到实际的所有者(登录的用户),所以我只需要发送 GoodsType 和 Amount。但是如果我使用这个请求:InventoryGoods good = _repository.First(x => (Equals(x.GoodsType, GivenGoodsType)) && (x.Amount >= GivenAmount));,脚本会停止并出现错误System.NotSupportedException: Boolean Equals(System.Object, System.Object)

我搜索了很多,在 SO 的某个地方(不幸的是我不记得链接)我发现 NHibernate 不支持“Equals”的语句(因为它不能转换为 SQL)。所以我搜索了一个解决方案,并找到了上面命名的教程。但是我找不到必须注册扩展名的文件。

我已经找到了这个解决方案:InventoryGoods good = _repository.First(x => x.Amount >= GivenAmount).Where(x => (Equals(x.GoodsType, GivenGoodsType)));,但我更喜欢一种不通过“Where”进行双重检查的方法,只有“First”。

编辑 2
我正在使用 Fluent NHibernate 进行映射。

4

1 回答 1

0

据我所知,NHibernate 支持 Equals 进行对象比较。事实上,你应该重写它,只要默认等于实现中继内存地址,而不是对象值。

看到这个类似的问题: 当 Equals 方法被覆盖时,为什么覆盖 GetHashCode 很重要?

NHibernate:重写 Equals 和 GetHashCode 的原因

于 2012-05-28T16:22:38.853 回答