如何首先为多个表在 entity framework 代码中植入身份种子值

How to seed identity seed value in entity framework code first for several tables

我看过this and this。我只是希望为我的代码优先 (EF6.1) 表设置 ID 列的起始值。现在我可以做到了

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

但是因为我有很多很多的表,我觉得很奇怪(而且感觉几乎是错误的)我必须为所有这些重复上面的行。我还没有找到任何方法来使用流畅的配置来做到这一点。这是做种子的正确方法吗?

谢谢

你可以尝试使用这个:

    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、添加列、重命名列等以在每个 table 上将其触发到 运行。不幸的是,您将不得不做一些更新每个 table 的事情,以便能够对它们中的每一个注入您自己的操作。

另一种方法是在 SQL 服务器中编写脚本 - 这不像是每天或每周发生一次。遍历 tables,重置每个种子。但是,如果您需要定期在所有 table 上发生某些事情,而不是在 SQL 服务器中发生,那么我认为上述方法是可行的。