Свойство Nullable вызывает ошибки, когда NULL в NHibernate - PullRequest
0 голосов
/ 18 ноября 2008

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

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

Он также определяется как обнуляемое поле в базе данных. Если запись в БД имеет столбец OwnerID, установленный в целое число, этот объект корректно загружается NHibernate. Но если для записи установлено нулевое значение, бомбы 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?

Ответы [ 2 ]

2 голосов
/ 18 ноября 2008

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

2 голосов
/ 18 ноября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...