我们正在开发一个域名,其中要求会员协议因网络和州组合而异。 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
答案 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");