自定义EF代码第一个身份生成

时间:2012-10-02 17:15:20

标签: entity-framework-5 ef-migrations

使用EntityFramework 5,我有一个新的数据库,我需要在表上指定身份种子,而不是“1”。

使用模型构建器,迁移或其他方法,是否有一种简单的方法来更改表的标识生成以处理此问题?

目前,我正在考虑创建在迁移期间生成的自定义sql,以便在创建表后对其进行修改。一个更清洁的解决方案是首先让CREATE TABLE正确。

2 个答案:

答案 0 :(得分:0)

我正在处理同样的问题,现在按照计划a:

  1. 通过以下方式初始化自定义迁移计划:

    Database.SetInitializer(new 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();
    
  4. 或我为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");
    

答案 1 :(得分:0)

遗憾的是,在执行查询批处理之前,我还没有找到“添加预查询”的方法 如果有人会找到一种方法 - 然后在执行提交之前 - 我们可以执行sql:  “set identity_inster on”

“设置identity_inster off”

对于t-sql来说更自然