我的数据库中有这些相关的表格:
table [Files]: FileID FileName ------ -------- 1 /data/foo.jpeg 2 /data/bar.gif table [Attachments]: FileID DocumentID Caption ------ ---------- ------- 1 10 Foo is awesome. 1 20 Foo is horrible. 2 10 Bars are my favorite. table [Documents]: DocumentID Title ---------- ----- 10 Things Jack loves. 20 Stuff Mary hates.
这是他们当前在NHibernate中映射的方式:
<class name="File" table="Files">
<id name="Id" type="System.Int32" column="FileID">
<generator class="identity" />
</id>
<property name="FileName" column="FileName" type="System.String" />
</class>
<joined-subclass name="Attachment" table="Attachments" extends="File">
<key column="FileID" />
<property name="DocumentID" column="DocumentID" type="System.Int32" />
<property name="Caption" column="Caption" type="System.String" />
</joined-subclass>
<class name="Document" table="Documents">
<id name="Id" type="System.Int32" column="DocumentID">
<generator class="identity" />
</id>
<property name="Title" column="Title" type="System.String" />
</class>
我知道这个映射不太适合Attachments表的架构 有没有更好的方法来映射这些表?
(这与my previous question有关。)
答案 0 :(得分:2)
要详细说明上述答案,您可以使用多对一元素来设置关系,并使用集合映射使关系成双向,这似乎对您的架构有用。
您将在附件的映射中使用多对一元素。例如,
<many-to-one name="File" class="File" column="FileID"/>
您可以在文件映射中指定反转:
<set name="Attachments" inverse="true" lazy="true">
<key column="FileID" />
<one-to-many class="Attachment" />
</set>
您可以为文档执行相同的操作。上面的名称只是从架构中获取,但你仍然需要确保它们匹配他们的类等等。但这是整体想法。
答案 1 :(得分:0)
您在询问如何强制执行附件和文档之间的关系?如果为true,请参阅"many-to-one" element。