如何运行迁移的Configuration类的Seed()方法

本文关键字:Configuration 类的 Seed 方法 迁移 运行 何运行 | 更新日期: 2023-09-27 18:15:44

我有两个问题:

1)我如何从包管理器控制台运行Seed()方法而不更新数据库模型?

2)是否有一种方法如何在代码中调用Seed()方法?

谢谢你的建议

如何运行迁移的Configuration类的Seed()方法

回答第一个问题。通过运行add-migration SeedOnly

创建迁移

清除生成的所有Up()和Down()代码,如果有任何未完成的更改

public partial class SeedOnly : DbMigration
{
    public override void Up()
    {
    }
    public override void Down()
    {
    }
}

然后您可以通过在Package Manager控制台

中运行update-database -TargetMigration SeedOnly来瞄准特定的迁移。

经过研究,我终于找到了解决这个问题的方法:

1)使Configuration公开:

public sealed class Configuration : DbMigrationsConfiguration<YourContextClassHere>

2)在任何地方添加下面的代码。它将运行最新的迁移并更新数据库:

Configuration configuration = new Configuration();
configuration.ContextType = typeof(YourContextClassHere);
var migrator = new DbMigrator(configuration);
//This will get the SQL script which will update the DB and write it to debug
var scriptor = new MigratorScriptingDecorator(migrator);
string script = scriptor.ScriptUpdate(sourceMigration: null, targetMigration: null).ToString();
Debug.Write(script);
//This will run the migration update script and will run Seed() method
migrator.Update();

回答问题#2:将Seed()方法中的所有代码提取到另一个类中。然后从Configuration类的Seed()方法中调用它:

    protected override void Seed(DbContext ctx)
    {
        new DatabaseSeed().Seed(ctx);
    }

那么你可以从任何地方调用它:

    new DatabaseSeed().Seed(new DbContext());

回答问题1:

人们通常会这样做:

  1. 对模型进行临时人工更改
  2. 切换到DropCreateDatabaseAlways,其结果是数据库经常被删除并在不需要时重新创建
  3. 手动删除数据库

参考:http://blog.oneunicorn.com/2013/05/28/database-initializer-and-migrations-seed-methods/

这不是你想要的,但是看看:通过命令行提示符运行实体框架迁移这可以帮助您或其他人忘记基于应用程序的数据库迁移,因为您可以轻松地使脚本自动运行…

如果将上下文初始化器设置为MigrateDatabaseToLatestVersion,则配置中的seed方法应该自动运行。不需要手动调用

Configuration类中添加一个新的公共方法。新方法只调用被保护的方法Seed:

public void RunSeed(DbContext db)
{
    Seed(db);
}

然后从eg中调用新方法。单元测试:

var db = new SomeDbContext();
var configuration = new Configuration();
configuration.RunSeed(db);

我知道这是一个非常古老的问题,但如果有人点击这里并出于分享信息的目的:

对我来说,回答问题1最简单的方法是先解决问题2,然后用结果来解决第一个问题。这将是一些简单的@leifbattermann回答上面(https://stackoverflow.com/a/24413407/2996749)或@Martin Staufcik方法,然后只是调用函数/方法在一些代码片段,你可以随时运行,与惊人的优势,它可以用来设置默认值在某些情况下,如创建新数据库的新客户,等等。

不要忘记,如果您使用@leifbattermann方法并从Configuration类以外的其他地方调用该函数并创建一个新的DbContext,那么您需要在此之后调用SaveChanges()。至少对我来说是这样的。

还有一件事:如果你没有挂起的迁移,只是想要种子,只需在包管理器控制台中运行命令"update-database",就可以完成这项工作。

如果您想要Update-Database --Target-Migration xxx并且您感到惊讶,因为我是seed()方法尚未运行,您可以尝试git stash所有更改,使用Update-Database从以前的版本生成数据库(到最后一个版本始终运行seed())和git stash apply然后。

这是一个丑陋的解决方法,但它帮助了我。

顺便说一句:不要忘记在隐藏

之前进行阶段更改。