情况是:
这是我的配置 - 没什么特别的:
public class MyMigrationConfiguration : DbMigrationsConfiguration<MyMigrationContext>
{
public MyMigrationConfiguration()
{
AutomaticMigrationsEnabled = false;
AutomaticMigrationDataLossAllowed = false;
MigrationsNamespace = "---";
MigrationsDirectory = "---";
}
}
这是我创建dbs的方法:
public void CreateOrUpdateDb(string DbName)
{
try
{
string connectionString = _connectionStringProvider.GetConnectionString(DbName);
DbMigrationsConfiguration cfg = CreateMigrationsConfig(connectionString);
cfg.AutomaticMigrationsEnabled = false;
cfg.AutomaticMigrationDataLossAllowed = false;
DbMigrator dbMigrator = new DbMigrator(cfg);
dbMigrator.Update();
}
catch (MigrationsException exception)
{
_logger.Error(string.Format("Error creating database '{0}'",DbName), exception);
}
}
我已经搜索并阅读了我在网络上可以找到的任何内容,但大多数示例包括标准的Configuration.cs等。没有人解释为什么我应该运行Enable-Migrations,因为它创建了Configuration.cs但我自己提供了Configuration类,并且不需要这个其他类。
这是异常堆栈:
> System.Data.Entity.Migrations.Infrastructure.MigrationsPendingException: Unable to generate an explicit migration because the following explicit migrations are pending: [201402121953301_Initial]. Apply the pending explicit migrations before attempting to generate a new explicit migration.
at System.Data.Entity.Migrations.DbMigrator.Scaffold(String migrationName, String namespace, Boolean ignoreChanges)
at System.Data.Entity.Migrations.Design.MigrationScaffolder.Scaffold(String migrationName, Boolean ignoreChanges)
at System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.Scaffold(MigrationScaffolder scaffolder)
at System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.Run()
at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
at System.Data.Entity.Migrations.Design.ToolingFacade.Scaffold(String migrationName, String language, String rootNamespace, Boolean ignoreChanges)
at System.Data.Entity.Migrations.AddMigrationCommand.Execute(String name, Boolean force, Boolean ignoreChanges)
at System.Data.Entity.Migrations.AddMigrationCommand.<>c__DisplayClass2.<.ctor>b__0()
有没有办法强制迁移器制作脚本而不告诉我有一些待处理的迁移,即使没有?这是EF的100%错误,但我不知道如何绕过它。
答案 0 :(得分:3)
我们找到了答案 - 我的聪明同事并在Reflector.
的帮助下但是在这种方法中会发生这种情况
contextKey =!string.IsNullOrWhiteSpace(contextKey)? contextKey.RestrictTo(this._contextKeyMaxLength):this._contextKey;
并且contextKey不再为null。它实际上变成了类型(YourInheritedDbMigrationConfiguration).ToString()
问题出在哪里?问题在于
因此,当我创建初始迁移脚本并启动站点并且站点应用脚本时,它可以,但在dbo._MigrationHistory中,ContextKey是“MyDbConigClass1”。之后,当我尝试Add-Migration使用另一个DbMigrationConfiguration类时,ContextKeys不匹配 - BOOM!
解决方案:在我的两个配置类中添加了相同的ContextKey =“MyTenantDb”,所有内容都重新开始工作,因为类型名称不再涉及,但DbMigrator使用了我的自定义ContextKey :)