如何创建NHibernate HasManyToMany关系

我知道有关于HasManyToMany的问题,但这次我想把几个字段放到中间表中,如’Description,CreationDate’。

对于我的情况,我不想双向绑定。 我有公司,人员和地址表。 每个公司或个人可能有超过1个地址。 在这种情况下我该怎么办? 我应该如何编写类和映射的代码?

您可以在下面看到表格:

在此处输入图像描述

在这种情况下,答案非常简单。 不要使用多对多。 使用配对对象。 正是由于您提到的原因:使用更多属性扩展配对对象:

点击这里24.最佳实践 ,引用:

不要使用异国情调的关联映射。

真正的多对多关联的良好用途很少见。 大多数情况下,您需要存储在“链接表”中的其他信息。 在这种情况下,使用两个一对多关联到中间链接类要好得多。 事实上,我们认为大多数关联是一对多和多对一,在使用任何其他关联风格时应该小心,并问自己是否真的是必要的。

换句话说,创建one-to-many关系,从配对对象引用配对对象,从配对对象创建one-to-many关系。

还要检查这些:

  • Hibernate:多对多关系表作为实体
  • NHibernate双向多对多映射列表/包
  • Nhibernate:如何用一对多关系表示多对多关系?

地址和公司的一个例子。 第一个配对对象

 public class AddressCompany { // the relation to both sides public virtual Address Address { get; set; } public virtual Company Company { get; set; } // many other settings we need public virtual string Description { get; set; } public virtual DateTime CreationDate { get; set; } ... } 

坚果壳中的地址和公司:

 public class Address { public virtual IList Companies { get; set; } ... } public class Company { public virtual IList Addresses { get; set; } ... } 

映射符合预期:

 public AddressMap() { HasMany(x => x.Companies) ... } public CompanyMap() { HasMany(x => x.Addresses) ... } public AddressCompanyMap() { References(x => x.Address).. References(x => x.Company).. ... } 

所以,这代表了Pairing对象

好吧,但现在我们可以找到一些日期后创建的公司:

 var subquery = QueryOver.Of() .Where(c => c.CreationDate > new DateTime(2000, 1, 1)) .Select(c => c.Company.ID); var query = session.QueryOver() .WithSubquery .WhereProperty(c => c.ID) .In(subquery) ...; 

这样我们也可以通过地址过滤公司…