我有两个问题:
1) 如何在不更新数据库模型的情况下从包管理器控制台运行 Seed() 方法?
2) 有没有办法在代码中调用 Seed() 方法?
谢谢任何建议。
我有两个问题:
1) 如何在不更新数据库模型的情况下从包管理器控制台运行 Seed() 方法?
2) 有没有办法在代码中调用 Seed() 方法?
谢谢任何建议。
回答你的第一个问题。通过运行 add-migration SeedOnly 创建迁移
如果有任何挂起的更改,清除所有生成的 Up() 和 Down() 代码
public partial class SeedOnly : DbMigration
{
public override void Up()
{
}
public override void Down()
{
}
}
然后,您可以通过在包管理器控制台中运行 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:
人们通常会通过以下方式解决这个问题:
参考: http ://blog.oneunicorn.com/2013/05/28/database-initializer-and-migrations-seed-methods/
这不完全是您正在寻找的,但请看一下:通过命令行提示运行实体框架迁移 这可能会帮助您或某人忘记基于应用程序的数据库迁移,因为您可以轻松地使脚本自动运行...
如果您使用上下文初始化程序作为 MigrateDatabaseToLatestVersion,配置中的种子方法应自动运行。不要认为您需要手动调用它。
在类中添加一个新的公共方法Configuration
。新方法只调用受保护的方法Seed
:
public void RunSeed(DbContext db)
{
Seed(db);
}
然后从例如调用新方法。单元测试:
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
这是一个丑陋的解决方法,但它帮助了我。
顺便说一句:不要忘记在存储之前进行更改