Nhibernate:非空属性引用多对一关系中的空值或瞬态值错误
本文关键字:空值 错误 关系 属性 多对一 引用 Nhibernate | 更新日期: 2023-09-27 18:36:51
我收到错误 not-null 属性在 NHibernate 中的许多关系中引用 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>
上传数据类
<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 个具有相同上传数据的实例,那么我将在repo.Delete(obj)
上收到错误"非空属性引用空值或瞬态值"
我用谷歌搜索了这个问题并找到了解决方案(例如,在映射中制作 not-null="false"),但没有解决问题。
指定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"
,因为它仅与字符串列相关