在这种情况下,答案非常简单。不要使用多对多。使用配对对象。正是出于您提到的原因:使用更多属性扩展配对对象:
检查这里24. 最佳实践 http://nhforge.org/doc/nh/en/index.html#best-practices,引用:
不要使用奇异的关联映射。
真正的多对多关联的良好用例很少见。大多数时候您需要在“链接表”中存储附加信息。在这种情况下,最好使用两个一对多关联到一个中间链接类。事实上,我们认为大多数关联都是一对多和多对一的,在使用任何其他关联样式时应该小心,并问问自己是否真的有必要。
换句话说,创建one-to-many
从两端引用配对对象的关系,以及many-to-one
来自配对对象。
还要检查这些:
- Hibernate:多对多关系表作为实体 https://stackoverflow.com/q/19687006/1679310
- NHibernate双向多对多映射列表/包 https://stackoverflow.com/q/15560856/1679310
- Nhibernate:如何用一对多关系表示多对多关系? https://stackoverflow.com/q/15510748/1679310
地址和公司的示例。第一个配对对象
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<AddressCompany> Companies { get; set; }
...
}
public class Company
{
public virtual IList<AddressCompany> 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)..
...
}
所以,这代表了配对对象
好吧,但现在我们可以找到一些在某个日期之后创建的公司:
var subquery = QueryOver.Of<AddressCompany>()
.Where(c => c.CreationDate > new DateTime(2000, 1, 1))
.Select(c => c.Company.ID);
var query = session.QueryOver<Company>()
.WithSubquery
.WhereProperty(c => c.ID)
.In(subquery)
...;
这样我们还可以通过地址过滤公司...