当我尝试将具有一对一关系的对象插入另一个对象时,我遇到了nhibernate的问题。有一个名为Article
的类映射文件
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<id name="ID" column="article_id" type="Int32" unsaved-value="0">
<generator class="native"/>
</id>
<property name="Title" column="title" type="String" not-null="true" length="255" />
<property name="Body" column="body" type="String" length="1073741823" />
<property name="IsEnabled" column="is_enabled" type="Boolean" not-null="true" />
<many-to-one name="ParentArticle" class="..." column="parent_id" cascade="all" />
<bag name="Children" lazy="true" cascade="all-delete-orphan" >
<key column="parent_id" />
<one-to-many class="..." />
</bag>
该类本身遵循此映射文件,为简单起见省略。
然后还有另一个名为SpecialArticle的类。该类的映射如下:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<id name="ID" column="id" type="Int32" unsaved-value="0">
<generator class="native"/>
</id>
<property name="Price" column="Price" type="Double" not-null="true" />
<one-to-one name="Article" class="..." fetch="join" cascade="all" />
然后,ArticleExtension类是:
public class SpecialArticle
{
/// <summary>
/// Get/Set the ID for this question
/// </summary>
public virtual int ID
{
get;
set;
}
/// <summary>
/// Get/Set the expected price for this question or answer
/// </summary>
public virtual Double Price
{
get;
set;
}
/// <summary>
/// Get/Set the article that contains the rest of the information for this question
/// </summary>
public virtual Article Article
{
get;
set;
}
}
当我想在db中插入一篇特殊文章时:
// Populate someArticle
// Populate someSpecialArticle
// Following code is wrapped in a transaction
someSpecialArticle.Article = someArticle;
Session.SaveOrUpdate(someArticle);
Session.SaveOrUpdate(someSpecialArticle);
对象someArticle插入正常,但对象someSpecialArticle的insert语句是: INSERT INTO tbl(Price)VALUES(@ p0);选择SCOPE_IDENTITY()
where_id是指定父文章???
THX
答案 0 :(得分:0)
正确的映射是:
<many-to-one name="Article" fetch="join" cascade="all" unique="true" />
当您在NHibernate中创建一对一映射时,一方必须映射为多对一 - 这将是负责存储外键的一方。由于您在此处有单向关系,因此您必须将其映射为多对一关系,并使用唯一约束使关系表现得像一对一
答案 1 :(得分:0)
使用从SpecialArticle到Article的多对一关系会更容易。一对一的关系可能很棘手,isn't a recommended approach。
在您的情况下,听起来像制作SpecialArticle扩展文章可能是一个合适的解决方案。然后,您可以使用join-subclass获取第二个表格中SpecialArticle所需的其他信息。