如何创建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) ...;
这样我们也可以通过地址过滤公司…