2012-10-02 34 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来说更加自然