如何暂时关闭EF Code First中的IDENTITY列?

时间:2011-08-22 18:14:57

标签: ef-code-first

我正在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");

2 个答案:

答案 0 :(得分:4)

你做不到。执行set identity_insert命令会更改SQL Server的行为,但不会更改实体框架的行为。

您有三种导入记录的选择:

  • 使用原始ADO.NET命令(非实体)或ExecuteSqlCommand
  • 使用其他DbContext,您可以在其中将密钥定义为非生成密钥。
  • 使用更适合数据转换的其他技术,例如SSIS

答案 1 :(得分:2)

我最近遇到了同样的问题。就我而言,我使用的是SQL Server CE。这是我的解决方案的链接:

Inserting all rows of a DataTable into a SQL Server table, including Id values(向下滚动到编辑2)

这基本上是迭戈的解决方案#1 - 原始ADO.NET。这不是一个很好的解决方案,因为您需要自定义查询以解决数据库中的任何差异,但希望它有助于解决您的问题。