C# 流利的NHibernate:“;无法在“对象”中插入重复键;即使Id是由.Native()或Identity()生成的
我有一个相当简单的表,带有适当的Fluent NHibernate映射,如下所示:C# 流利的NHibernate:“;无法在“对象”中插入重复键;即使Id是由.Native()或Identity()生成的,c#,sql-server,nhibernate,fluent-nhibernate,C#,Sql Server,Nhibernate,Fluent Nhibernate,我有一个相当简单的表,带有适当的Fluent NHibernate映射,如下所示: public class Blurb { public virtual byte SimpleId { get; set; } public virtual string Foo { get; set; } public virtual string Bar { get; set; } } public class BlurbMap: ClassMap<Blurb> {
public class Blurb {
public virtual byte SimpleId { get; set; }
public virtual string Foo { get; set; }
public virtual string Bar { get; set; }
}
public class BlurbMap: ClassMap<Blurb> {
public BlurbMap() {
Id(x => x.SimpleId).Column("PK_SimpleID").GeneratedBy.Identity();
Map(x => x.Foo);
Map(x => x.Bar);
Table("dbo.SimpleTable");
}
}
在我写“轰”的地方,我得到了一个例外:
could not insert: [Foo.Bar.Blurb][SQL: INSERT INTO dbo.SimpleTable (Foo, Bar) VALUES (?, ?); select SCOPE_IDENTITY()] ---> System.Data.SqlClient.SqlException: Violation of PRIMARY KEY constraint 'PK_SimpleID'. Cannot insert duplicate key in object 'dbo.SimpleTable'. The duplicate key value is (1).
我再次尝试使用SSMS插入,得到了相同的错误,但在随后执行查询时,错误消息会发生如下变化:
The duplicate key value is (1)
The duplicate key value is (2)
The duplicate key value is (3)
...
直到插入成功时碰到未使用的键为止
我已经尝试了GeneratedBy.Native()
,但没有成功。目前,我只能想到这样的解决方法
var lastBlurb = session.Query<Blurb>().Select(x => x.SimpleId).Max();
newBlurb.SimpleId = lastBlurb + 1;
session.SaveOrUpdate(newBlurb);
var lastburb=session.Query().Select(x=>x.SimpleId.Max();
newBlurb.SimpleId=lastBlurb+1;
session.SaveOrUpdate(newBlurb);
这是可行的,因为“真实”表只包含大约10到20个元素,而且只有一个程序对该表进行写访问(是的,我们确实知道这一点,并且可以肯定!),但是否有其他方法可以解决这个问题?还是(外部)数据库设计者做错了什么?我将此作为答案发布,因为它太长了 结果发现问题完全不同了。我在测试数据库中遇到了这个问题。我在我的开发系统上运行数据库的副本以进行集成测试。每次测试运行后,数据库都会被清除并重置为我从第三方收到它时的状态 在重置过程中,我有一个小家伙:
EXEC sp_MSForEachTable "DBCC CHECKIDENT ( '?', RESEED, 0)"
这会将每个标识列的种子设置为0,因此尝试插入新记录会导致错误。哦
现在,我更改了这一点,为每个表使用正确的值,分别发出dbcccheckident
命令,问题就消失了
头->桌子->砰…我将此作为答案发布,因为它很长 结果发现问题完全不同了。我在测试数据库中遇到了这个问题。我在我的开发系统上运行数据库的副本以进行集成测试。每次测试运行后,数据库都会被清除并重置为我从第三方收到它时的状态 在重置过程中,我有一个小家伙:
EXEC sp_MSForEachTable "DBCC CHECKIDENT ( '?', RESEED, 0)"
这会将每个标识列的种子设置为0,因此尝试插入新记录会导致错误。哦
现在,我更改了这一点,为每个表使用正确的值,分别发出dbcccheckident
命令,问题就消失了
头->桌子->砰