Nulllable属性在NHibernate中为空时导致错误

时间:2008-11-18 01:18:24

标签: c# sql-server nhibernate

我的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感到困惑吗?

2 个答案:

答案 0 :(得分:2)

您可以将对象中的类型更改为Nullable(int?)。 OwnerId不是保留关键字。如果您考虑一下,如何将DB null映射到Int32。值对象不支持null语义,因此您确实需要使用可空类型。

至于ModuleAnchorId我建议你打开显示sql,然后将sql发布到google上的nhibernate用户组。 nHibernate开发者关注那个群体。

答案 1 :(得分:2)

您需要在类定义中将属性OwnerID的类型设置为int?。您也可以删除type中的.hbm.xml属性,因为NHibernate可以从反射中推断出类型。