SQL Compact SET IDENTITY_INSERT [表] OFF似乎不起作用

时间:2016-03-09 16:55:15

标签: sql-server entity-framework entity-framework-6 sql-server-ce

我的应用程序支持SQL Server和Compact版本。我使用EntityFramework作为数据访问层。为了允许用户从Compact转到SQL Server并返回Compact,我有一种方法将数据从一个数据库复制到另一个数据库。从Compact到SQL Server可以正常工作,但是当我使用相同的代码从SQL Server复制到Compact时,我得到异常,告诉我在将对象添加到EF数据上下文并调用{后,我无法添加具有重复Id的行{1}}。

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

  1. 我让EF创建目标数据库
  2. 打开SqlConnection(SqlCeConnection到源数据库和目标数据库
  3. Foreach表I:
    • 在目标数据库SET IDENTITY_INSERT [Tablename] ON
    • 使用Sql插件逐行复制表格,包括ID'
    • 在目标数据库SET IDENTITY_INSERT [Tablename] OFF
  4. 因此,在将数据库从SQL Server复制到Compact并将其与Entity Framework一起使用后,我得到了上述异常。所以看起来context.SaveChanges()有效(因为数据进入了Compact数据库),但SET IDENTITY_INSERT ON不适用于SQL Compact。

    有没有人有类似的经历和解决方案?

2 个答案:

答案 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)