Nullable свойство вызывает ошибки, когда Null в NHibernate

У меня есть свойство, определенное в моем файле HBM следующим образом:

<property name="OwnerId" column="OwnerID" type="System.Int32" not-null="false" />

Он также определяется как поле, допускающее значение NULL, в базе данных. Если запись в БД имеет столбец 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 ссылается на нулевое или переходное значение:

[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?


person Kevin Albrecht    schedule 18.11.2008    source источник


Ответы (2)


Можете ли вы изменить тип вашего объекта на Nullable (int?). OwnerId не является зарезервированным ключевым словом. Если вы думаете об этом, как вы можете сопоставить нуль БД с Int32. Объекты-значения не поддерживают семантику null, поэтому вам действительно нужно использовать тип, допускающий значение null.

Что касается ModuleAnchorId, я рекомендую включить отображение sql, а затем опубликовать sql в группе пользователей nhibernate в google. Разработчики nHibernate обращают внимание на эту группу.

person JoshBerke    schedule 18.11.2008

Вам нужно установить тип свойства OwnerID на int? в определении класса. Вы также можете избавиться от атрибута type в .hbm.xml, так как NHibernate может вывести тип из отражения.

person yfeldblum    schedule 18.11.2008
comment
Теперь это довольно очевидно для меня. Я думал о Int32 как об упакованном ссылочном типе Integer в стиле Java. Спасибо. - person Kevin Albrecht; 18.11.2008