如何创建NHibernate HasManyToMany关系

时间:2014-01-15 11:07:59

标签: c# nhibernate fluent-nhibernate has-many

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

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

您可以在下面看到表格:

enter image description here

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)
    ...;

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