流畅的NHibernate复杂映射

时间:2013-01-23 15:28:32

标签: nhibernate mapping fluent

我们正在开发一个域名,其中要求会员协议因网络和州组合而异。 MemberAgreement有一个模板,可以由多个国家共享一个网络。

我们对实体进行建模的方式是

public class MemberAgreement
{
        public Network Network { get; protected set; }
        public List<State> States { get; protected set; }
        public Template Template {get; protected set; }
}

表格设计为:

Agreement
---------
Id
NetworkId
StateId
TemplateId

在此表协议中,NetworkId和TemplateId可以重复使用不同的StateIds。

现在,我如何在Fluent NHibernate中映射它?我们在网络和状态之间存在一对多关系,这两者的组合与模板有很多关系。

非常感谢帮助。

PC

1 个答案:

答案 0 :(得分:1)

表格结构将强制您更改MemberAgreement对象定义。每一行(ID唯一)只引用一个ReferenceType:

public class MemberAgreement
{
  public virtual Network Network { get; protected set; }
  //  public List<State> States { get; protected set; }
  public virtual State State { get; protected set; }
  public virtual Template Template {get; protected set; }
}

有了这个,您的映射将被简化为References(x => x.State)。但是,您的业务层中会出现更多问题,您必须使用集合:IList<MemberAgreement>

其他选项是使用6.9. Ternary Associations。提取并应用于网络:

public class Network
{
  ...
  public virtual IDictionary<State, Template> StateTemplates { get; set; }
}

<map name="States" table="Agreement" >
    <key column="NetworkId" />
    <index-many-to-many column="StateId" class="State" />
    <many-to-many column="TempalteId" class="Template" />
</map>

和Fluent一样:

HasMany(x => x.StateTemplates)
    .KeyColumn("NetworkId")
    .AsMap<State>("StateId")
    .AsTernaryAssociation("TemplateId");