Fluent Hibernate Insert Fail,无法将值NULL插入列'Id',

时间:2013-07-08 20:45:40

标签: sql nhibernate fluent-nhibernate

我使用NHibernate

在INSERT语句中获得异常

这是在存储库(自定义)层中调用它的方式

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

这是生成的SQL语句,我在日志中找到它们

2013-07-08 15:28:43,419 [36] DEBUG NHibernate.SQL - INSERT INTO [Season](Name,StartDate,EndDate,ModifiedDate)VALUES(@ p0,@ p1,@ p2,@ P3);选择SCOPE_IDENTITY(); @ p0 ='season 4'[类型:字符串(4000)],@ p1 = 6/13/2014 12:00:00 AM [类型:日期时间(0)],@ p2 = 12/31 / 2013 12:00:00 AM [类型:日期时间(0)],@ p3 = 7/8/2013 3:28:43 PM [类型:日期时间(0)]

这是我得到的例外

2013-07-08 15:28:43,429 [36]警告NHibernate.Util.ADOExceptionReporter - System.Data.SqlClient.SqlException(0x80131904):无法将值NULL插入列'Id',表' ticketing.social.dbo.Season“;列不允许空值。 INSERT失败。

为什么不能在表“Season”中插入新行,即使它正在使用select SCOPE_IDENTITY();

而不是CurrentSession.SaveorUpdate(),我可以在ISession中使用另一种方法吗?

请指教,非常感谢

3 个答案:

答案 0 :(得分:3)

由于这是一个SQL异常,并且您的查询显示正常,看起来您的ORM设置正确,但您的数据库却没有。我敢打赌,你的专栏实际上并不是数据库中的IDENTITY列。

答案 1 :(得分:0)

因为您没有在插入列表中设置ID。参见:

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

那里没有ID。因此,DB尝试为不允许的ID插入NULL。

答案 2 :(得分:0)

当您使用Fluent NHibernate时,我会假设您使用Fluent映射映射类,而不是自动映射。

在映射类中,您必须定义ID的生成方式。我假设您正在使用IDENTITY列,因为`SCOPE_IDENTITY()``调用。

在这种情况下,您必须将其映射为:

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