2

我在使用 NHibernate 的表中插入语句时遇到异常

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

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

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

2013-07-08 15:28:43,919 [36] 调试 NHibernate.SQL - 插入 [季节](名称、开始日期、结束日期、修改日期)值(@p0、@p1、@p2、@p3);选择 SCOPE_IDENTITY();@p0 = '第 4 季' [类型:字符串 (4000)],@p1 = 6/13/2014 12:00:00 AM [类型:日期时间 (0)],@p2 = 12/31 /2013 12:00:00 AM [类型:DateTime (0)],@p3 = 7/8/2013 3:28:43 PM [类型:DateTime (0)]

这是我得到的例外

2013-07-08 15:28:43,929 [36] WARN NHibernate.Util.ADOExceptionReporter - System.Data.SqlClient.SqlException (0x80131904):无法将值 NULL 插入到列 'Id'、表 'ticketing.social.dbo。季节'; 列不允许空值。插入失败。

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

除了 CurrentSession.SaveorUpdate(),我还可以从 ISession 中使用另一种方法吗?

请指教,非常感谢

4

3 回答 3

3

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

于 2013-07-08T21:12:33.903 回答
0

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

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

那里没有身份证。因此数据库尝试为不允许的 ID 插入 NULL。

于 2013-07-08T20:47:53.010 回答
0

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

在您的映射类中,您必须定义如何生成 ID。我假设你正在使用一个IDENTITY列,因为那个 SCOPE_IDENTITY() 调用。

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

this.Id(x => x.Id).Column("Id").GeneratedBy.Identity();
于 2013-07-08T21:07:48.980 回答