Sql server SQL压缩集标识\u INSERT[Table]OFF似乎不起作用
我的应用程序支持SQL Server和Compact edition。我使用EntityFramework作为数据访问层。为了允许用户从Compact到SQL Server再回到Compact,我有一种方法可以将数据从一个数据库复制到另一个数据库。从Compact到SQL Server这一点很好,但当我使用相同的代码从SQL Server复制到Compact时,会出现异常,告诉我在将对象添加到EF数据上下文并调用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的行 以下是我复制
context.SaveChanges()
后,无法添加具有重复Id的行
以下是我复制表格的方式:
- 在目标数据库上,在
- 使用Sql插入(包括ID)逐行复制表
- 在目标数据库上,将IDENTITY_INSERT[Tablename]设置为OFF
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命令