NHibernate一对多生成插入和更新

NHibernate一对多生成插入和更新,nhibernate,one-to-many,insert-update,Nhibernate,One To Many,Insert Update,嗨,我有一个包含文档一对多映射的请求类 请求类 public class Request { virtual public int Id { get; set; } ... virtual public Iesi.Collections.Generic.ISet<Document> Documents { get; set; } } XML映射如下所示: 请求 及 我不明白为什么NHibernate

嗨,我有一个包含文档一对多映射的请求类

请求类

public class Request
{
virtual public int Id
    {
        get;
        set;
    }
...
virtual public Iesi.Collections.Generic.ISet<Document> Documents
  {
       get;
       set;
  }
}
XML映射如下所示: 请求

我不明白为什么NHibernate的更新字段已经有了正确的值,却生成了INSERT和UPDATE

我也找到了这个帖子 这是建议使用inverse,但当我将其添加到映射时,ParentEntityId将被0填充


谢谢

将文档类更改为引用请求类而不是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=false
(默认情况下,不需要设置ParentEntity属性),NHibernate将自动检测该关系。但它附带了额外的update语句,我们在这里试图避免它

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

<?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>

**
**

谢谢。你的解决方案有效。我没有意识到相反的含义。
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
public class Document
{
  public virtual int Id
  {
    get;
    set;
  }

  public virtual Request ParentEntity
  {
    get;
    set;
  }
}
    <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>
Request objRequest = new Request();    
objRequest.Documents = new Iesi.Collections.Generic.ISet<Document>() 
                            { 
                                 new Document() { Id = 1, ParentEntity = objRequest }  
                            };
<?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>