2011-08-22 64 views
4

我在EF Code First中创建了一个现有应用程序的重写,但我需要从现有应用程序的数据库中导入一些数据。这是我的实体类的定义:如何暂时关闭EF Code First中的IDENTITY列?

public class Business : EntityBase 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int AccountNumber { get; set; } 

现在,进口记录需要从旧系统保留其AccountNumber值。但是,新值应使用数据库生成的IDENTITY值。

如何在我导入旧记录时关闭IDENTITY,然后在应用程序的剩余生命周期中将其重新打开?在导入记录之前执行此操作无效:

context.Database.ExecuteSqlCommand("set identity_insert Businesses on"); 

回答

4

您不能。执行set identity_insert命令会更改SQL Server的行为,但不会改变实体框架的行为。

您有进口记录三种选择:

  • 使用原始ADO.NET命令(未实体)或ExecuteSqlCommand
  • 使用不同的DbContext,其中您将键定义为未生成。
  • 使用不同的技术,更适合于数据转换,像SSIS
2

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

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

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