Sql server SQL压缩集标识\u INSERT[Table]OFF似乎不起作用

Sql server SQL压缩集标识\u INSERT[Table]OFF似乎不起作用,sql-server,entity-framework,entity-framework-6,sql-server-ce,Sql Server,Entity Framework,Entity Framework 6,Sql Server Ce,我的应用程序支持SQL Server和Compact edition。我使用EntityFramework作为数据访问层。为了允许用户从Compact到SQL Server再回到Compact,我有一种方法可以将数据从一个数据库复制到另一个数据库。从Compact到SQL Server这一点很好,但当我使用相同的代码从SQL Server复制到Compact时,会出现异常,告诉我在将对象添加到EF数据上下文并调用context.SaveChanges()后,无法添加具有重复Id的行 以下是我复制

我的应用程序支持SQL Server和Compact edition。我使用EntityFramework作为数据访问层。为了允许用户从Compact到SQL Server再回到Compact,我有一种方法可以将数据从一个数据库复制到另一个数据库。从Compact到SQL Server这一点很好,但当我使用相同的代码从SQL Server复制到Compact时,会出现异常,告诉我在将对象添加到EF数据上下文并调用
context.SaveChanges()
后,无法添加具有重复Id的行

以下是我复制表格的方式:

  • 我让EF创建目标数据库
  • 打开到源数据库和目标数据库的SqlConnection(SqlCeConnection)
  • 表一:
    • 在目标数据库上,在
    • 使用Sql插入(包括ID)逐行复制表
    • 在目标数据库上,将IDENTITY_INSERT[Tablename]设置为OFF
  • 因此,在我将数据库从SQL Server复制到Compact并与实体框架一起使用之后,我得到了上述异常。因此,看起来
    SET IDENTITY\u INSERT ON
    起作用(因为数据进入Compact数据库),但
    SET IDENTITY\u INSERT OFF
    在SQL Compact上不起作用


    是否有人有过类似的经历并为我提供了解决方案?

    如果您在尝试添加重复密钥时遇到错误,则您遇到的问题与
    标识插入设置无关。标识插入仅在会话期间持续

    可能发生的情况是,您插入了高于当前标识种子值的键值。您可以在SQL Server中使用以下命令为表的标识种子重新设定种子:

    DBCC CHECKIDENT (MyTable, reseed)
    
    您可以在实体框架中通过以下方式执行此操作:

    context.Database.ExecuteSqlCommand("DBCC CHECKIDENT(MyTable, reseed)")
    

    这将重置种子,使其在表中使用的最后一个值之后开始编号。填充每个目标表后运行此语句。

    好的,ErikEJ提示将我带到了正确的方向。最终解决方案是

    a) 获取当前的最大Id

    SELECT MAX(Id) FROM TABLENAME
    
    b) 重新播种,但最大值为+1

    ALTER TABLE [TABLENAME] ALTER COLUMN [Id] IDENTITY (<MAX + 1>,1)
    
    ALTER TABLE[TABLENAME]ALTER COLUMN[Id]IDENTITY(,1)
    
    您需要重新设定种子。。。谢谢Erik,但是使用您非常酷的工具并执行SQL语句,我得到了一个错误:“列在创建后不能成为标识列”听起来它不是一个标识列,只是为了确保:在复制数据库之后以及我开始在应用程序中使用它时,在我的应用程序中会出现提到的错误。在这一点上的数据是正常的,我没有重复的关键点。关键是,这个错误只有在我从服务器复制了数据库之后才会出现。Id由EF处理,我从不设置我自己的Id。幸运的是,compact版不支持DBCC命令