0

NHibernate の多対 1 の関係で、null 以外のプロパティが null または一時的な値を参照しているというエラーが発生します。

コード:

class MyData
{
    public string Name{get;set;}    
    public virtual UploadData UploadData { get; set; }
    public int UploadId{get;set;}
}

class UploadData
{
    public int UploadId{get;set;}
    public DateTime Date{get;set;}
}

マッピング

<class name="MyData, NS" table="MyData" lazy="false">
    <id name="Identifier" type="Int32" unsaved-value="0">
      <column name="Identifier" sql-type="int" 
              not-null="true" unique="true" index="PK_dbo.MyData"/>
      <generator class="identity" />
    </id>
    <property name='Name' column='Name'/>
    <property name='UploadId' column='UploadId'/>      
    <many-to-one name="UploadData" class="UploadData, NS">
          <column name="UploadId" length="5" sql-type="int" not-null="true" index="UploadId"/>
    </many-to-one>
 </class>

UploadData クラス

<class name="UploadData, NS" table="UploadData" lazy="false">
    <id name="UploadId" type="Int32" unsaved-value="0">
      <column name="UploadId" sql-type="int" 
              not-null="true" unique="true" index="PK_dbo.UploadData"/>
      <generator class="identity" />
    </id>
    <property name='Data' column='Date' />
</class>

以下のコードを使用してレコードを削除しています。

foreach(MyData obj in myDataCollection)
repo.Delete(obj) // delete using repository.
repo.Delete(obj.UploadData) 

myDataCollection に同じ UploadData を持つ 2 つのインスタンスが含まれている場合、「null でないプロパティが null または一時的な値を参照しています」というエラーが表示されます。repo.Delete(obj)

問題をググって解決策を見つけました (例: マッピングで not-null="false" にする) が、問題は解決しませんでした。

4

1 に答える 1

1

cascade="all"削除操作がカスケードされ、NHibernate が重複した参照を処理する必要があることを指定します。

<many-to-one name="UploadData" class="UploadData, NS" cascade="all">

// then this is enough to delete mydata and associated UploadData
foreach(MyData obj in myDataCollection)
{
   repo.Delete(obj);
}

ここにもいくつかの問題があります

  • public int UploadId{ get; set; }冗長であり、列が 2 回マップされるため、SQL パラメーター エラーが発生します。UploadData.UploadId同じものを与える
  • length="5"文字列列にのみ関連するため、無視されます
于 2012-06-11T12:50:57.643 に答える