46

我有两个问题:

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

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

谢谢任何建议。

4

9 回答 9

45

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

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

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

    public override void Down()
    {
    }
}

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

于 2015-12-30T06:46:08.077 回答
26

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

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();
于 2013-06-27T09:19:32.407 回答
7

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

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

然后你可以从任何地方调用它:

    new DatabaseSeed().Seed(new DbContext());
于 2014-06-25T15:56:55.437 回答
3

回答问题1:

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

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

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

于 2015-12-31T06:57:22.477 回答
2

这不完全是您正在寻找的,但请看一下:通过命令行提示运行实体框架迁移 这可能会帮助您或某人忘记基于应用程序的数据库迁移,因为您可以轻松地使脚本自动运行...

于 2016-09-30T05:24:32.307 回答
1

如果您使用上下文初始化程序作为 MigrateDatabaseToLatestVersion,配置中的种子方法应自动运行。不要认为您需要手动调用它。

于 2013-05-29T15:21:55.903 回答
1

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

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

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

var db = new SomeDbContext();
var configuration = new Configuration();
configuration.RunSeed(db);
于 2018-03-29T14:47:48.407 回答
1

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

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

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

还有一件事:如果您没有待处理的迁移并且只想播种,只需在包管理器控制台中运行命令“update-database”即可完成这项工作。

于 2019-07-18T11:11:40.207 回答
0

如果您愿意并且因为我没有运行Update-Database --Target-Migration xxx该方法而感到惊讶,您可以尝试所有更改,使用(到始终运行的最后一个修订版)从以前的版本生成数据库,然后。seed()git stashUpdate-Databaseseed()git stash apply

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

顺便说一句:不要忘记在存储之前进行更改

于 2017-03-10T16:42:38.693 回答