我收到“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; }
}
}
答案 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)
PropertyValueException
可能有很多原因。您必须设法找出导致问题的属性...
映射中的所有引用类型也必须映射。我没有看到MyRecordState,OFAC_LOOKUP或OBJECTION的任何映射。
对于插入/更新,您可能必须设置级联和反向选项才能正确插入值...