我的HBM文件中定义了一个属性,如下所示:
<property name="OwnerId" column="OwnerID" type="System.Int32" not-null="false" />
它也被定义为数据库中的可空字段。如果DB中的记录将OwnerID列设置为整数,则NHibernate会正确加载此对象。但如果记录将其设置为null,则NHibernate会出现看似随机的错误,包括:
1)列名'ModuleAnchorID'在结果列列表中出现多次:
[SqlException (0x80131904): Column name 'ModuleAnchorID' appears more than once in the result column list.]
System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +925466
System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +800118
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +186
System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +1932
System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +149
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +1005
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +132
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) +149
System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +135
NHibernate.Impl.NonBatchingBatcher.AddToBatch(IExpectation expectation) +35
NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Object[] oldFields, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session) +1055
2)not-null属性引用null或transient值:
[PropertyValueException: not-null property references a null or transient value:]
NHibernate.Impl.SessionImpl.CheckNullability(Object[] values, IEntityPersister persister, Boolean isUpdate) +224
NHibernate.Impl.SessionImpl.FlushEntity(Object obj, EntityEntry entry) +1019
NHibernate.Impl.SessionImpl.FlushEntities() +182
NHibernate.Impl.SessionImpl.FlushEverything() +90
NHibernate.Impl.SessionImpl.AutoFlushIfRequired(ISet querySpaces) +64
NHibernate.Impl.SessionImpl.Find(CriteriaImpl criteria, IList results) +217
NHibernate.Impl.SessionImpl.Find(CriteriaImpl criteria) +42
NHibernate.Impl.CriteriaImpl.List() +29
OwnerID是一个保留的字段名称,它在某种程度上让NHibernate感到困惑吗?
答案 0 :(得分:2)
您可以将对象中的类型更改为Nullable(int?)。 OwnerId不是保留关键字。如果您考虑一下,如何将DB null映射到Int32。值对象不支持null语义,因此您确实需要使用可空类型。
至于ModuleAnchorId我建议你打开显示sql,然后将sql发布到google上的nhibernate用户组。 nHibernate开发者关注那个群体。
答案 1 :(得分:2)
您需要在类定义中将属性OwnerID
的类型设置为int?
。您也可以删除type
中的.hbm.xml
属性,因为NHibernate可以从反射中推断出类型。