【问题标题】:Nhibernate : not-null property references a null or transient value error in many to one relationshipNhibernate:非空属性在多对一关系中引用空值或瞬态值错误
【发布时间】:2012-06-14 07:27:28
【问题描述】:

我在 NHibernate 中的多对一关系中收到错误not-null property references a null or transient value

代码:

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")但没有解决问题。

【问题讨论】:

  • 我认为您缺少级联。我对 Xml 映射非常不满意,但是 iirc 你想要父级上的反向级联和子级上的常规级联。 jroller.com/RickHigh/entry/…

标签: c# nhibernate nhibernate-mapping spring.net


【解决方案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" 被忽略,因为它只与字符串列相关

【讨论】:

  • 我收到以下错误 Spring.Data.NHibernate.HibernateObjectRetrievalFailureException: Spring.Data.NHibernate.HibernateObjectRetrievalFailureException: 已删除的对象将被级联重新保存(从关联中删除已删除的对象)[UploadData] --- > NHibernate.ObjectDeletedException:已删除的对象将被级联重新保存(从关联中删除已删除的对象)[UploadData]。
  • 我用一个最小的例子对此进行了测试,只有当您不删除所有引用 Uploaddata 的对象(或将引用设置为 null)时才会出现问题,我怀疑您在某处有不同的问题
猜你喜欢
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 2017-04-25
  • 1970-01-01
  • 2016-11-26
相关资源
最近更新 更多