0

我在 NHibernate 中的多对一关系中收到错误非空属性引用空值或瞬态值。

代码:

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>

上传数据类

<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 包含 2 个具有相同 UploadData 的实例,那么我将收到错误“非空属性引用空值或瞬态值”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; }是多余的,并且会导致 SQL 参数错误,因为该列被映射了两次。UploadData.UploadId会给同样的
  • length="5"被忽略,因为它仅与字符串列相关
于 2012-06-11T12:50:57.643 回答