如何在实体框架代码中首先为几个表生成标识种子值

时间:2015-03-07 22:26:22

标签: c# entity-framework ef-code-first

我看过thisthis。我只想为我的代码优先(EF6.1)表的ID列的起始值设定种子。现在我可以做到这一点

public class CustomInitializer : CreateDatabaseIfNotExists<FormsDbContext>
{
    protected override void Seed(FormsDbContext context)
    {
        context.Database.ExecuteSqlCommand("DBCC CHECKIDENT ('MyTable', RESEED, 1000)");
    }
}

但是由于我有很多很多桌子,我发现它很奇怪(而且感觉差不多)我必须为所有这些重复上述线路。我无法通过流畅的配置找到任何方法。这是种子的正确方法吗?

由于

1 个答案:

答案 0 :(得分:4)

你可以试试这个:

    internal class DefaultMigrationSqlGenerator : SqlServerMigrationSqlGenerator
    {
        protected override void Generate(AlterTableOperation alterTableOperation)
        {
            base.Generate(alterTableOperation);
            // If the tables you want to reseed have an Id primary key...
            if (alterTableOperation.Columns.Any(c => c.Name == "Id"))
            {
                string sqlSeedReset = string.Format("DBCC CHECKIDENT ({0}, RESEED, 1000) ", alterTableOperation.Name.Replace("dbo.", ""));

                base.Generate(new SqlOperation(sqlSeedReset));
            }
        }
    }

您可以使用多种不同的选项而不是AlterTableOperation,添加列,重命名列等以触发此操作在每个表上运行。不幸的是,你必须做一些更新每个表的事情才能在每个表上注入你自己的动作。

另一种方法是在SQL Server中编写脚本 - 它不像是每天或每周发生。遍历表格,重置每个表格上的种子。但是如果你需要定期在所有表上发生某些事情,而不是在SQL Server中,那么我认为以上是可行的方法。