2013-07-08 2 views
1

я получаю исключение на INSERT заявление в таблице с помощью NHibernateсвободный Hibernate Insert Сбой, не удается вставить значение NULL в столбец «Id»,

Вот как это называется в Repository (обычая) слой

private void AddOrUpdateObject(object objectToUpdate) 
{ 
    UnitOfWork.CurrentSession.SaveOrUpdate(objectToUpdate); 
} 

Это SQL заявление генерируется, я нашел их в журнале

2013-07-08 15: 28: 43919 [36] DEBUG NHibernate.SQL - INSERT INTO [Сезон] (Имя, StartDate , EndDate, ModifiedDate) VALUES (@ p0, @ p1, @ p2, @ p3); выберите SCOPE_IDENTITY(); @ p0 = 'season 4' [Тип: String (4000)], @ p1 = 6/13/2014 12:00:00 AM [Тип: DateTime (0)], @ p2 = 12/31/2013 00:00 AM [Тип: DateTime (0)], @ p3 = 7/8/2013 3:28:43 PM [Тип: DateTime (0)]

Это исключение Я получение

2013-07-08 15: 28: 43929 [36] WARN NHibernate.Util.ADOExceptionReporter - System.Data.SqlClient.SqlException (0x80131904): не удается вставить значение NULL в столбец 'Id', таблица " ticketing.social.dbo.Season '; столбец не допускает нулей. INSERT терпит неудачу.

Почему он не может вставить новую строку в таблицу «Сезон», даже если она использует select SCOPE_IDENTITY();

Вместо CurrentSession.SaveorUpdate(), есть ли другой метод, который я мог бы использовать из ISession?

Пожалуйста, посоветуйте, большое спасибо

+0

Пожалуйста, добавьте свой класс отображения в вопрос. Держу пари, вы пропустили 'Id' определение части –

ответ

0

Потому что вы не устанавливать идентификатор в списке вставки. См .:

INSERT INTO [Season] (Name, StartDate, EndDate, ModifiedDate) 

Нет ID. Таким образом, БД пытается вставить NULL для ID, который не разрешен.

+0

проблема, потому что я только что сделал экспорт данных, нет индекса или первичного ключа не были скопированы – doglin

0

Поскольку вы используете Fluent NHibernate, я буду предполагать, что вы сопоставляете свои классы с использованием Fluent mapping, а не для автоматического сопоставления.

В вашем классе сопоставления вы должны определить, как будет создан идентификатор. Я предполагаю, что вы используете столбец IDENTITY из-за этого вызова `SCOPE_IDENTITY()` `.

В этом случае, необходимо сопоставить его как:

this.Id(x => x.Id).Column("Id").GeneratedBy.Identity(); 
+0

это моя модель класса общественного класса SeasonMap: ClassMap { общественного SeasonMap() { Id (x => x.Id) .GeneratedBy.Native(). UnsavedValue ("0"); – doglin

+0

, так что вы говорите, вместо GeneratedBy.Native, я должен использовать GeneratedBy.Identity(). Я думаю, что я должен дать ему понять, и решить, разрешает ли это проблема. – doglin

+0

@doglin Почему вы используете это сопоставление? Это личность в базе данных? –

3

Поскольку это исключение SQL, а запрос появляется хорошо, кажется, что ваш ОРМ установлен правильно, но база данных не является. Я бы сказал, что ваш столбец фактически не является столбцом IDENTITY в базе данных.

Смежные вопросы