我正在EF Code First中创建现有应用程序的重写,但我需要从现有应用程序的数据库中导入一些数据。这是我的实体类的定义:
public class Business : EntityBase
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int AccountNumber { get; set; }
现在,导入的记录需要保留旧系统的AccountNumber
值。但是,新值应使用DB生成的IDENTITY
值。
如何在导入旧记录时关闭IDENTITY
,然后在应用程序的剩余生命周期内重新打开它?在导入记录之前执行此操作无效:
context.Database.ExecuteSqlCommand("set identity_insert Businesses on");
答案 0 :(得分:4)
你做不到。执行set identity_insert
命令会更改SQL Server的行为,但不会更改实体框架的行为。
您有三种导入记录的选择:
ExecuteSqlCommand
。DbContext
,您可以在其中将密钥定义为非生成密钥。答案 1 :(得分:2)
我最近遇到了同样的问题。就我而言,我使用的是SQL Server CE。这是我的解决方案的链接:
Inserting all rows of a DataTable into a SQL Server table, including Id values(向下滚动到编辑2)
这基本上是迭戈的解决方案#1 - 原始ADO.NET。这不是一个很好的解决方案,因为您需要自定义查询以解决数据库中的任何差异,但希望它有助于解决您的问题。