NHibernate一对多生成插入和更新

标签 nhibernate one-to-many insert-update

您好,我有 Request 类,其中包含文档一对多映射。

请求类

public class Request
{
virtual public int Id
    {
        get;
        set;
    }
...
virtual public Iesi.Collections.Generic.ISet<Document> Documents
  {
       get;
       set;
  }
}

文档类

public class Document
{
public virtual int Id
{
    get;
    set;
}

public virtual int ParentEntityId
{
    get;
    set;
}
}

XML 映射如下所示: 请求

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    assembly="xxxx"
    namespace="xxxx.Domain">
<class name="Request" table="tbl_Req">
    <id name="Id" column="req_id">
    <generator class="native"></generator>
        </id>
    <set name="Documents" cascade="all-delete-orphan"  inverse="false">
        <key column="doc_parent_ent_id" not-null="true"/>
            <one-to-many class="xxxx.Domain.Document"/>
    </set>
</class>  
</hibernate-mapping>

文档看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    assembly="xxxx"
    namespace="xxxx.Domain">
<class name="Document"  table="tbl_doc">
<id name="Id" column="doc_id">
    <generator class="native"></generator>
</id>
</class>
</hibernate-mapping>

现在,当我保存 NHibernate 创建的文档时,采用此配置

INSERT INTO tbl_doc (doc_digimage_code, doc_lnk_filename, doc_lnk_filepath, doc_timestamp, doc_author, doc_parent_ent_id) VALUES (@p0, @p1, @p2, @p3, @p4, @p5); select SCOPE_IDENTITY()',N'@p0 nvarchar(4000),@p1 nvarchar(4000),@p2 nvarchar(4000),@p3 datetime,@p4 int,@p5 int',@p0=N'1',@p1=NULL,@p2=NULL,@p3='2013-02-28 18:05:45',@p4=7353,@p5=174

UPDATE tbl_doc SET doc_parent_ent_id = @p0 WHERE doc_id = @p1',N'@p0 int,@p1 int',@p0=174,@p1=32

我不明白为什么 NHibernate 在其更新字段已经具有正确值时生成 INSERT 和 UPDATE。

我还发现了这篇文章NHibernate insert generates updates for collection items 这建议使用 inverse,但是当我将其添加到映射时,ParentEntityId 会填充 0。

谢谢

最佳答案

更改您的 Document 类以引用 Request 类而不是 ParentEntityId。

public class Document
{
  public virtual int Id
  {
    get;
    set;
  }

  public virtual Request ParentEntity
  {
    get;
    set;
  }
}

在文档上设置inverse = true,当您尝试插入新请求时,该文档不会发出额外的更新语句。

    <set name="Documents" cascade="all-delete-orphan"  **inverse="true"**>
        <key column="doc_parent_ent_id" not-null="true"/>
            <one-to-many class="xxxx.Domain.Document"/>
    </set>

但指定 inverse = true 意味着 Document 对象应自行处理关系,即,每当将新文档添加到请求文档列表时,请务必设置 ParentEntity 属性。

Request objRequest = new Request();    
objRequest.Documents = new Iesi.Collections.Generic.ISet<Document>() 
                            { 
                                 new Document() { Id = 1, ParentEntity = objRequest }  
                            };

通过设置inverse=false(默认情况下),不需要设置ParentEntity属性,NHibernate将自动检测关系。但它附带了额外的更新语句,我们在这里试图避免这种情况。

最后,在文档映射中包含多对一关系。

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    assembly="xxxx"
    namespace="xxxx.Domain">
<class name="Document"  table="tbl_doc">
<id name="Id" column="doc_id">
    <generator class="native"></generator>
</id>

**<many-to-one cascade="none" class="xxx.Request" name="ParentEntity">
  <column name="doc_parent_ent_id" not-null="true" />
</many-to-one>**

</class>
</hibernate-mapping>

关于NHibernate一对多生成插入和更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15141628/

相关文章:

python - 过滤SQLAlchemy查询结果对象的一对多属性

MySQL - 在更新两个表的插入触发器之后?

.net - NHibernate多重查询/Oracle future

c# - NHibernate QueryOver 和子查询的问题

NHibernate.Bytecode.UnableToLoadProxyFactoryFactoryException

java - JPA注解@OneToMany关系不同记录

mysql - 如何建立具有多个一对多关系的数据库?使用数据透视表或连接表?

sql - Oracle - 不对未修改的值执行更新的 UPSERT

Java Mongodb 更新数据库对象

NHibernate 和 IoC IInterceptor