我知道有关于HasManyToMany的问题,但这次我想把几个字段放到中间表中,如'Description,CreationDate'。
对于我的情况,我不想双向绑定。我有公司,人员和地址表。 每个公司或个人可能有超过1个地址。 在这种情况下我该怎么办? 我该如何编写类和映射的代码?
您可以在下面看到表格:
答案 0 :(得分:1)
在这种情况下,答案非常简单。不要使用多对多。使用配对对象。正是由于您提到的原因:使用更多属性扩展配对对象:
点击此处24. Best Practices,引用:
不要使用异国情调的关联映射。
真正的多对多关联的良好用例很少见。大多数情况下,您需要存储在“链接表”中的其他信息。在这种情况下,使用两个一对多关联到中间链接类要好得多。事实上,我们认为大多数协会都是一对多和多对一,你在使用任何其他协会风格时应该小心,并问自己是否真的有必要。
换句话说,创建引用配对对象的one-to-many
关系,以及配对对象中的many-to-one
。
同时检查以下内容:
地址和公司的一个例子。第一个配对对象
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)
...;
这样我们也可以通过地址过滤公司......