NHibernate:如何正确建模这个模式

时间:2009-12-09 01:17:30

标签: c# nhibernate nhibernate-mapping

我的数据库中有这些相关的表格:

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有关。)

2 个答案:

答案 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