我有两个问题:
1)如何在没有更新数据库模型的情况下从包管理器控制台运行Seed()方法?
2)有没有办法在代码中调用Seed()方法?
任何建议都是如此。
答案 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:
人们通常会通过以下方式解决这个问题:
参考: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>
这是一种丑陋的解决方法,但它帮助了我。
顺便说一句:不要忘记在存储之前暂存你的更改