获取“错误使X类型的属性值脱水”错误,并且TryUpdateModel和UpdateModel不起作用

时间:2013-12-24 19:50:32

标签: asp.net nhibernate

我收到“X类型的脱水属性值错误”我检查了数据库表的映射,并且所有单个属性都匹配。 在我的实体和nhiberate中都有其他对象(多对一关系)。我被困在如何追踪和修复dyhyrdrating错误。也, TryUpdateModel和UpdateModel根本没有更新。任何帮助表示赞赏。

<hibernate-mapping assembly="MY.BusinessEntities" namespace="MY.BusinessEntities.NHObjects" xmlns="urn:nhibernate-mapping-2.2">
<class name="MY_OBJECTION" table="MY_OBJECTION" lazy="true" >
  <id name="MY_OBJECTION_UID">
    <column name="MY_OBJECTION_UID" sql-type="NUMBER" not-null="true"  />
    <generator class="native">
      <param name="sequence">SEQ_MY_OBJECTION</param>
    </generator>
  </id>

  <many-to-one column="MY_RECORD_UID" name="MyRecordState" class="MyRecordState">
    <column name="MY_RECORD_UID" />
  </many-to-one>

  <many-to-one column="RECORD_TYPE" name="RECORD_TYPE" class="OFAC_LOOKUP" not-found="ignore" />
  <many-to-one column="OBJECTION_UID" name="OBJECTION" class="OBJECTION" not-found="ignore" />
  <property name="OBJECTION_UID" column="OBJECTION_UID" type="int" /> 
  <property name="MY_RECORD_UID" column="MY_RECORD_UID" type="int" />
  <property name="CASE_ID" column="CASE_ID" type="string"  />
  <property name="CASE_UID" column="CASE_UID" type="int" />
  <property name="RECORD_TYPE_UID" column="RECORD_TYPE" type="int" />
  <property name="REFERENCE_TO" column="REFERENCE_TO" type="int" />
  <property name="REMARKS" column="REMARKS" type="string" />
  <property name="BULK_ASSIGN" column="BULK_ASSIGN" type="char" />

  <component name="AuditInfo" class="AuditMetadata">
    <property name="DateCreated" column="DATE_CREATED" type="date" />
    <property name="CreatedBy" column="CREATED_BY" type="int"/>
    <property name="DateChanged" column="DATE_CHANGED" type="date" />
    <property name="ChangedBy" column="CHANGED_BY" type="int"/>
  </component>

</class>
</hibernate-mapping>

实体:

namespace MY.BusinessEntities.NHObjects {

  public class MY_OBJECTION {
    public MY_OBJECTION() {}
    public virtual int MY_OBJECTION_UID { get; set; }
    public virtual MyRecordState MyRecordState { get; set; }

    public virtual OFAC_LOOKUP RECORD_TYPE { get; set; }
    public virtual OBJECTION OBJECTION { get; set; }
    public virtual int OBJECTION_UID { get; set; }

    public virtual int REFERENCE_TO { get; set; }
    public virtual string REMARKS { get; set; }
    public virtual char BULK_ASSIGN { get; set; }

    public virtual AuditMetadata AuditInfo { get; set; }

    public virtual int MY_RECORD_UID { get; set; }
    public virtual string CASE_ID { get; set; }
    public virtual int CASE_UID { get; set; }
    public virtual int RECORD_TYPE_UID { get; set; }
  }
}

2 个答案:

答案 0 :(得分:1)

映射问题

有一个明显的映射问题,导致此类错误。在下面的代码片段中我简化了2)移动到一起3)调整了映射属性的顺序,使其更加清晰:

<many-to-one column="RECORD_TYPE"   name="RECORD_TYPE" class="OFAC_LOOKUP" ... />
<property    column="RECORD_TYPE"   name="RECORD_TYPE_UID" type="int" />
...
<many-to-one column="OBJECTION_UID" name="OBJECTION"   class="OBJECTION" .../>
<property    column="OBJECTION_UID" name="OBJECTION_UID" type="int" /> 
...

对于NHibernate来说这是一个真正的问题。我们正在指导他:在INSERT和UPDATE期间,SQL应该将一列定位两次:对象引用 int 以存储到RECORD_TYPE resp。 OBJECTION_UID

那是上述问题来自哪里(也许还有更多,但我现在发现了这个问题)

解决方案

在NHibernate中,我们可以将其中一些映射标记为 readonly 。这将带来许多优势。首先,此错误将不再存在,因为在INSERT和UPDATE期间,我们不会以这些映射为目标。另一方面,我们仍然可以访问Filtering / WHERE,Projections / SELECT和ORDER BY的只读属性......很酷

根据我的经验,首选的方法是保持引用的活跃性和int表示只读:

<many-to-one column="RECORD_TYPE"   name="RECORD_TYPE" class="OFAC_LOOKUP" ... />
<property    column="RECORD_TYPE"   name="RECORD_TYPE_UID" type="int" 
             insert="false" update="false" /> <!-- readonly now --> 
...
<many-to-one column="OBJECTION_UID" name="OBJECTION"   class="OBJECTION" .../>
<property    column="OBJECTION_UID" name="OBJECTION_UID" type="int" 
             insert="false" update="false" /> <!-- readonly now -->
...

答案 1 :(得分:0)

nh抛出的

PropertyValueException可能有很多原因。您必须设法找出导致问题的属性...

映射中的所有引用类型也必须映射。我没有看到MyRecordState,OFAC_LOOKUP或OBJECTION的任何映射。

对于插入/更新,您可能必须设置级联和反向选项才能正确插入值...