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

时间:2013-05-28 08:05:51

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

我有两个问题:

1)如何在没有更新数据库模型的情况下从包管理器控制台运行Seed()方法?

2)有没有办法在代码中调用Seed()方法?

任何建议都是如此。

9 个答案:

答案 0 :(得分:39)

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

创建迁移

如果有任何待处理的更改,则清除所有生成的Up()和Down()代码

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

    public override void Down()
    {
    }
}

然后,您可以通过在程序包管理器控制台中运行update-database -TargetMigration SeedOnly来定位特定的迁移

答案 1 :(得分:24)

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

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 :(得分:5)

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

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

然后你可以从任何地方打电话:

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

答案 3 :(得分:2)

回答问题1:

人们通常会通过以下方式解决这个问题:

  1. 对模型进行临时人工更改
  2. 切换到DropCreateDatabaseAlways,结果是数据库经常被删除并在不需要时重新创建
  3. 手动删除数据库
  4. 参考:http://blog.oneunicorn.com/2013/05/28/database-initializer-and-migrations-seed-methods/

答案 4 :(得分:1)

这不完全符合您的要求,但请查看:Running Entity Framework Migrations via command line prompt 这可能会帮助您或某人忘记基于应用程序的数据库迁移,因为您可以轻松地使脚本自动运行...

答案 5 :(得分:0)

如果使用context initiliazer作为MigrateDatabaseToLatestVersion,则应自动运行配置中的种子方法。不要以为你需要手动调用它。

答案 6 :(得分:0)

将新的公共方法添加到Configuration类中。新方法仅调用受保护的方法Seed

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

然后从例如调用新方法。单元测试:

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

答案 7 :(得分:0)

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

对我来说,回答问题1的最简单方法是先解决问题2,然后使用结果来解决第一个问题。这就像上面@leifbattermann(https://stackoverflow.com/a/24413407/2996749)或@Martin Staufcik方法所回答的那样简单,然后只需在某些代码中调用函数/方法,就可以在任何需要的时候运行,令人惊叹优点是,它可以在某些情况下(例如,为新客户创建新数据库)设置默认值。

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

还有一件事情:如果您没有挂起的迁移,只是想播种,只需在Package Manager控制台中运行“ update-database”命令即可。

答案 8 :(得分:-1)

如果你想Update-Database --Target-Migration xxx并且你感到惊讶,因为我没有运行seed()方法,你可以尝试git stash所有更改,使用以前的版本生成数据库Update-Database(对于始终运行seed()的最新修订版)和git stash apply然后。{/ p>

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

顺便说一句:不要忘记在存储之前暂存你的更改