使用NHibernate检索映射表的PK

时间:2009-04-03 14:44:38

标签: c# nhibernate

刚刚开始使用NHIbernate并且有一个问题,可能有点像stupi! ;-) 我有2个表,电子邮件和附件,电子邮件可以有零个或多个附件。所以我创建了一个像这样的hbm文件:

                                                           

<set name="Attachments" table="Attachments">
  <key column="EmailId" foreign-key="fk_Attachments_Emails"/>
  <composite-element class="Foo.Emails.Attachment, Foo.Emails">
    <!-- PROBLEM HERE!!! -->
    <property name="Id" column="Id" type="long"  />          
    <!-- END PROBLEM -->
    <property name="Name" column="Name" type="String" length="50"/>
    <property name="Mime" column="MimeType" type="String" length="50"/>      
    <property name="Size" column="Size" type="long" />
    <property name="FilePath" column="FilePath" type="String" length="256"/>
    <property name="Parsed" column="Parsed" type="Boolean" />
  </composite-element>
</set>

由于我希望能够通过PK(集合中的Id列)搜索附件,我将其包含在内,但现在每次我尝试保存带附件的电子邮件时,我都会从数据库中收到错误,因为Nhibernate尝试在PK中插入一个值,我的db自然不会允许。

所以,我的问题是,我可以提取Attqachment表的pk但是在插入电子邮件/附件时阻止Nhiberntate写它吗?我应该换成另一个容器吗?如果是这样的话,你可以提供一个例子,因为我努力找到一个我理解的那个!

谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

也许是一个更实际的例子?你有这样一个对象结构的地方:

电子邮件
--EmailId
--EmailProperty1
  --AttachmentCollection

附件
--AttachmentId
  --ParentEmail
--AttachmentProperty1

映射到这样的表结构(不是我如何命名,但它是例如):

电子邮件
--emailId int PK,身份
--emailProp1 varchar(50)

emailattachment
  --attachmentId int PK,身份
--emailId int,FK到电子邮件表
  --attachmentProp1 varchar(50)

<hibernate-mapping>
        <class name="Email" table="email">
          <id name="EmailId">
            <!-- this tells NHibernate to use DB to generate id -->
            <generator class="native"/>
          </id>
          <property name="EmailProperty1" column="emailProp1"/>
          <bag name="AttachmentCollection" lazy="true" inverse="true">
            <key column="emailId"/>
            <one-to-many class="Foo.Emails.Attachment, Foo.Emails"/>
          </bag>
        </class>
        <class name="Attachment" table="emailattachment">
          <id name="AttachmentId">
            <generator class="native"/>
          </id>
          <property="AttachmentProperty1" column="attachmentProp1"/>
          <many-to-one name="ParentEmail" class="Foo.Emails.Email, Foo.Emails" lazy="proxy" column="emailId">
        </class>
    </hibernate-mapping>

在这个地图中,你将获得双向关系,并且该生成器标签告诉nhibernate具有null Id属性的对象(你还可以指定另一个“unsaved-value”),然后你要插入对象,否则更新。应该解决你当前的问题。

结合其他事情:仔细检查映射时需要使用哪种容器(包与设置与列表)。在hibernatingrhino的NHibernateFAQ中有一个很好的写作。

另外,既然你是NHibernate的新手,我非常非常推荐summer of nhibernate screencasts。到目前为止我发现的最好的工具。

答案 1 :(得分:0)

我想你想要双向关系。这样您就可以双向导航关联。这包括生成的密钥......这是一个例子:

  <class name="Order" table="ORDERHEADER" lazy="false" >
<id name="OrderId" column="ORDERID" type="int">
  <generator class="sequence">
    <param name="sequence">"ORDERID_SEQ"</param>
  </generator>
</id>
<property name="OrderType" column="ORDERTYPE" type="Int16"/>
<bag name="OrderDetail" table="ORDERDETAIL" lazy="false" inverse="true">
  <key column="OrderId"/>
  <one-to-many class="OrderDetail"  />
</bag>

  <class name="OrderDetail" table="ORDERDETAIL" lazy="false">
<id name="OrderDetailId" column="ORDERDETAILID" type="int">
  <generator class="sequence">
    <param name="sequence">"ORDERDTLID_SEQ"</param>
  </generator>
</id>
<property name="OrderId" column="ORDERID" type="Int32"/>
<property name="ItemNumber" column="ITEMNUMBER" type="Int32"/>
<property name="OrderQuantity" column="ORDERQUANTITY" type="Int32"/>
<many-to-one name="Order" class="Order" column="OrderId" />