Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 流利的NHibernate:“;无法在“对象”中插入重复键;即使Id是由.Native()或Identity()生成的_C#_Sql Server_Nhibernate_Fluent Nhibernate - Fatal编程技术网

C# 流利的NHibernate:“;无法在“对象”中插入重复键;即使Id是由.Native()或Identity()生成的

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> {

我有一个相当简单的表,带有适当的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 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
命令,问题就消失了

头->桌子->砰