0

使用 EntityFramework 5,我有一个新数据库,我需要在其中将表上的标识种子指定为“1”以外的值。

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

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

4

2 回答 2

0

我正在处理同样的问题,现在遵循以下计划:

  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();
    

或以下我为 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");
于 2013-01-03T11:06:26.943 回答
0

不幸的是,我还没有找到在执行查询批处理之前“添加预查询”的方法,如果有人能找到这样做的方法 - 然后在执行提交之前 - 我们可以执行 sql:“set identity_inster on”

“设置 identity_inster 关闭”

这对 t-sql 来说更自然

于 2013-01-03T11:10:12.253 回答