2016-05-24 48 views
2

我正在開發使用實體框架6 Code First和ASP.NET與SQL Server 2014作爲後端的舊版應用程序的新版本。舊數據庫是一個Access數據庫,並有大約十幾個帶​​有自動增量ID的表。我想導入舊數據,同時保持ID不變,以保持表之間的關係。我給自己定的新實體的關鍵屬性在實體框架中導入數據後自動遞增ID

DatabaseGeneratedOption.None 

這工作,我能夠導入所有的值從舊的數據庫,但是我想有主鍵自動從這點開始增加。由於DatabaseGeneratedOption設置爲None,因此似乎必須手動生成ID

+1

我的錯誤; SQL Server 2014與Visual Studio 2015. – Nse

+0

您*可以*添加新實體到EF,並附加實體。如果你在一個'SaveChanges'操作中做到這一點,EF將使用自動生成的Id值作爲FK值。當然,如果數據庫不是太大,或者您可以將數據複製到明顯不同的集合中,這纔是可行的。 –

回答

4

您可能希望將密鑰設置爲原樣,然後在導入過程中禁用身份約束。

您可以在插入語句之前使用SET IDENTITY_INSERT tablename ON。完成後不要忘記將其設置爲OFF。

+0

我正在使用實體框架代碼優先進行導入(即NewClient.ID = reader(「ClientID」))。有沒有辦法通過實體框架來做到這一點,或者我需要使用SQL命令來編寫腳本嗎?我很好地使用SQL命令,但是我將不得不重構一些我的代碼。 – Nse

+1

@Nse在遷移中運行SQL:'Sql(「SET IDENTITY_INSERT tablename ON」)''很簡單。此外,請注意,它可能並不像您希望在創建後將列更改爲IDENTITY那樣簡單http://stackoverflow.com/a/18917348/150342 – Colin

+0

@Mattias非常感謝您的工作。 – Nse

0

我從來沒有嘗試過這一點,但你可以有不同的配置和切換他們按規定/環境,希望這有助於

public class IdentityDbConfiguration : EntityTypeConfiguration<Foo> 
{ 
    public IdentityDbConfiguration() 
    { 
     Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
    } 
} 

public class DbConfiguration : EntityTypeConfiguration<Foo> 
{ 
    public DbConfiguration() 
    { 
     Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
    } 
} 

public class AppContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new IdentityDbConfiguration()); 
    } 
} 

public class AppContext2 : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new DbConfiguration()); 
    } 
}