2012-10-02 68 views
0

使用EntityFramework 5,我有一個新的數據庫,我需要指定表上的身份種子是非「1」的東西。自定義EF代碼第一個身份生成

無論是模型構建器,遷移或其他方式,是否有一種簡單的方法來更改表的身份生成來處理此問題?

目前,我正在研究創建自定義sql以在遷移期間調用以在創建表後對其進行修改。更清潔的解決方案將首先獲得CREATE TABLE正確。

回答

0

我有同樣的問題的工作,現在下面的計劃有:

  1. 初始化定製的遷移計劃是:

    Database.SetInitializer(新MigrateDatabaseToLatestVersion());

  2. 檢查,實體必須生成(類 MyInitConfiguration):以正常的方式

    protected override void Seed(MyDbContext context) 
    { 
        var he = context.Set<MyEntity>(); 
        if (!he.Any(h => h.Id == 0)) 
        { 
         ...place to add code... 
    
  3. 添加實體(或多個實體),但「前執行提交 - 調用外部SQL腳本:

    he.Add(new MyEntity{ Id = -5, Alias = "system",Title = "System"}); 
        he.Add(new MyEntity{ Id = -4, Alias = "system1",Title = "System1"}); 
        he.Add(new MyEntity{ Id = -3, Alias = "system2",Title = "System2"}); 
        context.Database.ExecuteSqlCommand(
        string.Format("DBCC CHECKIDENT ('{2}', RESEED, {0});",-5,"MyTableName") 
        ); 
        context.Commit(); 
    

或以下擴展我對的DbContext製備:

public static void UpdateIdentity<T, TKey>(this MyDbContext context, Func<T> data, TKey staticPreviousId, string tableName,string columnName="id") 
      where T : MyEntity<TKey> 
     { 
      var r = data(); 
      context.Database.ExecuteSqlCommand(string.Format("DBCC CHECKIDENT ('{2}', RESEED, {0});", staticPreviousId, r.Id, tableName, columnName)); 
      context.Commit();    
     } 

然後只需執行:

context.UpdateIdentity(() => myDataSet.Add(new MyEntity{ Id = -5, Alias = "system",Title = "System"}), -5, "myTableName"); 


context.UpdateIdentity(() => myDataSet.Add(new MyEntity{ Id = 81, Alias = "system",Title = "System"}), 80, "myTableName"); 
0

不幸的是我還沒有找到一個方法來「添加預查詢」前執行查詢批處理 如果有人會找到一個方法來做到這一點 - 然後前執行提交 - 我們可以執行SQL:

「設置identity_inster關」

「上設置identity_inster」

這對t-sql來說更加自然