2

こんにちは、ドキュメントの一対多マッピングを含む 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 マッピングは次のようになります。 REQUEST

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

DOCUMENT は次のようになります。

<?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 がコレクション項目の更新を生成することを発見しまし た。

ありがとう

4

1 に答える 1

2

Document クラスを変更して、ParentEntityId の代わりに Request クラスを参照するようにします。

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 は自動的に関係を検出します。ただし、ここでは避けようとしている追加の更新ステートメントが付属しています。

最後に、ドキュメント マッピングに多対 1 の関係を含めます。

<?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>
于 2013-02-28T18:01:15.853 に答える