【问题标题】:How to seed identity seed value in entity framework code first for several tables如何首先在实体框架代码中为多个表播种身份种子值
【发布时间】:2015-03-07 22:26:22
【问题描述】:

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

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

但由于我有很多很多的桌子,我觉得很奇怪(而且感觉几乎是错误的)我不得不为所有这些重复上面的行。我还没有找到任何使用 fluent configuration 的方法。这是做种子的正确方法吗?

谢谢

【问题讨论】:

  • 如果您想重置所有内容,为什么不删除并重新创建数据库?
  • 但我会丢失所有数据。我不想丢失数据。我只希望我的所有列 ID 都以开始,例如 5000
  • 您可以获取上下文中所有表的名称并为它们执行命令。
  • thx,是的,我可以,但这意味着很多种子行,我的问题是,是否有更简洁的方法来做到这一点

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


【解决方案1】:

你可以试试这个:

    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 中,那么我认为上述方法是可行的。

【讨论】:

  • 我喜欢这种方法,这对我有用。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 2019-02-21
  • 1970-01-01
相关资源
最近更新 更多