将具有一对一关系的对象插入另一个对象时出现Nhibernate错误

时间:2009-07-25 11:08:17

标签: nhibernate

当我尝试将具有一对一关系的对象插入另一个对象时,我遇到了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

2 个答案:

答案 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所需的其他信息。