NHibernate中用于哈希集的实体的要求

NHibernate中用于哈希集的实体的要求,nhibernate,equality,hashset,Nhibernate,Equality,Hashset,我想对NHibernate中的实体集合使用Iesi.Collections HashedSet类。我想要的功能是不能添加重复的实体。如果实体共享Id(即主键)字段,或者如果它们的Id==0(即未保存),则将某些键属性进行比较,我希望将它们视为重复的实体 我注意到,默认情况下,HashedSet似乎使用引用相等来定义重复项。为了让HashedSet根据我上面描述的规则定义复制,我需要更改什么?(例如override.Equals、override==等)。您需要重写GetHashCode方法。必须

我想对NHibernate中的实体集合使用Iesi.Collections HashedSet类。我想要的功能是不能添加重复的实体。如果实体共享Id(即主键)字段,或者如果它们的Id==0(即未保存),则将某些键属性进行比较,我希望将它们视为重复的实体


我注意到,默认情况下,HashedSet似乎使用引用相等来定义重复项。为了让HashedSet根据我上面描述的规则定义复制,我需要更改什么?(例如override.Equals、override==等)。

您需要重写GetHashCode方法。

必须始终同时重写Equals和GetHashCode。各国:

重写GetHashCode的派生类也必须重写Equals,以保证被认为相等的两个对象具有相同的哈希代码;否则,哈希表类型可能无法正常工作

Jon Skeet对的回答提供了更多信息


重写相等运算符是可选的,但我建议您这样做。

谢谢您的建议。我将GetHashCode重写为return Id.GetHashCode(),但它不起作用。HashedSet可以包含两个Id为的实体。HashedSet不会包含两个hashcode为的对象。您应该检查实现,我认为[TestFixture]公共类EntityTestSuite{[Test]public void两个具有相同Id的实体拥有相同的Hashcode(){Entity bob=new Entity(){Id=1,Name=“bob”};Entity margaret=new Entity(){Id=1,Name=“margaret”};Assert==margaret.GetHashCode());}…[Test]public void两个具有相同Id的实体不能插入到集合()中{ISet Entities=new HashedSet();Entity bob=new Entity(){Id=1,Name=“bob”};Entity margaret=new Entity(){Id=1,Name=“margaret”};Entities.Add(bob);Entities.Add(margaret);Assert.That(entities.Count==1);}}公共类实体{public int-Id{get;set;}公共字符串名称{get;set;}公共重写int-GetHashCode(){return Id.GetHashCode();}