我正在使用DbMigrator
类来获取待处理迁移的列表。由于某种原因,即使存在待定迁移,它也不会返回任何项目。我错过了一步吗?
var configuration = new Migrations.Configuration();
configuration.TargetDatabase = new DbConnectionInfo("MyDatabase");
var migrator = new DbMigrator(configuration);
var migs = migrator.GetPendingMigrations().ToList();
Console.WriteLine(migrator.GetPendingMigrations().ToString());
我认为它可能是连接字符串,但有趣的是migrator.GetDatabaseMigrations()
返回已应用于数据库的正确迁移列表。
答案 0 :(得分:4)
同样的事情发生在我身上,原因是我在一个不同的集会中工作。在这种情况下,您需要指定包含迁移的程序集和命名空间:
config.MigrationsAssembly = Assembly.GetAssembly(typeof([One of your migration classes]));
config.MigrationsNamespace = "[Namespace containing your migrations]";
答案 1 :(得分:2)
我也有同样的问题,经过一周的研究和阅读.Net源终于找到了解决方案。 如果您使用不同的程序集,则可以完全按照以下方式设置配置程序集信息:
public void UpdateDatabaseToLatestVersion()
{
var configuration = new DbMigrationsConfiguration();
var type = GetType();
configuration.MigrationsAssembly = type.Assembly;
configuration.TargetDatabase = new DbConnectionInfo(connectionString, "System.Data.SqlClient");
configuration.MigrationsNamespace = type.Namespace + ".Migrations";
configuration.ContextKey = type.Namespace + ".Migrations.Configuration";
configuration.ContextType = type;
var migrator = new DbMigrator(configuration);
migrator.Update();
}
此代码位于DbContextBase
类中,我项目中的所有DbContext
都继承DbContextBase
。 DbContextBase
是抽象的,它位于另一个程序集中。从每个DbContext调用UpdateDatabaseToLatestVersion
时,var type = GetType();
返回继承的DbContext类型。
答案 2 :(得分:0)
在实体框架核心中尝试解决此问题时,我遇到了他的问题。发布我如何修复它,以防其他人也随机遇到此问题以尝试解决此问题。
这是有关如何在EF Core中修复此问题的解决方案。
我将此扩展方法添加到了我的代码中
public static IApplicationBuilder MigrateDatabase(this IApplicationBuilder app, IServiceScopeFactory scopeFactory)
{
using (var scope = scopeFactory.CreateScope())
{
var db = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
db.Database.EnsureCreated(); // this was my problem. If the database was missing, then the migrations were never applied.
var migrations = db.Database.GetPendingMigrations();
if (migrations.Any())
db.Database.Migrate();
}
return app;
}
然后我在Startup.cs中将其命名为
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceScopeFactory scopeFactory)
{
// other things here
app.MigrateDatabase(scopeFactory);
}