我的应用程序支持SQL Server和Compact版本。我使用EntityFramework作为数据访问层。为了允许用户从Compact转到SQL Server并返回Compact,我有一种方法将数据从一个数据库复制到另一个数据库。从Compact到SQL Server可以正常工作,但是当我使用相同的代码从SQL Server复制到Compact时,我得到异常,告诉我在将对象添加到EF数据上下文并调用{后,我无法添加具有重复Id的行{1}}。
以下是我复制表格的方法:
因此,在将数据库从SQL Server复制到Compact并将其与Entity Framework一起使用后,我得到了上述异常。所以看起来context.SaveChanges()
有效(因为数据进入了Compact数据库),但SET IDENTITY_INSERT ON
不适用于SQL Compact。
有没有人有类似的经历和解决方案?
答案 0 :(得分:0)
如果您在尝试添加重复密钥时收到错误,那么您遇到的问题与IDENTITY_INSERT
设置无关。身份插入仅在您的会话期间持续存在。
可能发生的是您插入了高于当前标识种子值的键值。您可以在SQL Server中使用此命令重新设置表的标识种子:
DBCC CHECKIDENT (MyTable, reseed)
您可以使用以下命令在实体框架中执行此操作:
context.Database.ExecuteSqlCommand("DBCC CHECKIDENT(MyTable, reseed)")
这将重置种子,以便在表格中使用的最后一个值之后开始编号。填充每个目标表后运行此语句。
答案 1 :(得分:0)
好的,ErikEJ提示让我走向了正确的方向。最终决议是
a)获取当前最大ID
SELECT MAX(Id) FROM TABLENAME
b)重新种植,但MAX + 1
ALTER TABLE [TABLENAME] ALTER COLUMN [Id] IDENTITY (<MAX + 1>,1)