刚刚开始使用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写它吗?我应该换成另一个容器吗?如果是这样的话,你可以提供一个例子,因为我努力找到一个我理解的那个!
谢谢你的帮助!
答案 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" />