2013-04-10 90 views
9

我一直在项目中使用实体框架(5.0)一段时间(ASP.NET MVC中的VS2012 Express)。但是现在,我不再能够添加迁移。实体框架:添加迁移失败,无法更新数据库

PM > Add-Migration -projectName MyProject.DAL TestMigration 
Unable to update database to match the current model because there are pending changes and automatic migration is disabled. Either write the pending model changes to a code-based migration or enable automatic migration. Set DbMigrationsConfiguration.AutomaticMigrationsEnabled to true to enable automatic migration. 

我不知道这给任何线索,但“无法...”文本显示为红色。

我试图启用自动迁移(这让我很没有意义试图将未决的模型更改写入基于代码的迁移),并导致数据库中所需的迁移。但这不是我想要的,因为我然后在项目中没有迁移。试图删除数据库并重新创建数据库。数据库被重新创建(直到以前的迁移),但是当我尝试使用Add-Migratio ñ我仍然收到“无法更新..”错误。

编辑

我试图强制参数,但没有差异。

我的配置类的内容(我没有以前迁移后改变任何东西):

public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
    } 

    protected override void Seed(Bekosense.DAL.Context.BekosenseContext context) 
    {   
     context.Database.ExecuteSqlCommand(Properties.Resources.TriggerAlertMessageDrop); 
     context.Database.ExecuteSqlCommand(Properties.Resources.TriggerAlertMessageCreate); 
     context.Database.ExecuteSqlCommand(Properties.Resources.TriggerAlertMessageSentDrop); 
     context.Database.ExecuteSqlCommand(Properties.Resources.TriggerAlertMessageSentCreate); 
     context.Database.ExecuteSqlCommand(Properties.Resources.AddDbUsers); 
    } 

编辑2 我发现我能够做的时候我评论一个附加迁移以下行出我的DbContext:

//Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>()); 

当我离开上述有源行和注释掉配置文件中的一切,但它仍然是行不通的。 为什么Database.SetInitializer行会导致这种奇怪的行为?

+1

能否请您发表您的配置文件迁移? – IronMan84 2013-04-10 15:45:55

+0

您是否尝试过-force参数? – 2013-04-10 20:25:43

+0

我有同样的问题,swapneel的答案下面为我工作,虽然它有点极端。幸运的是,我处于开始阶段,所以它不是太大的交易 – 2013-07-16 18:46:40

回答

4

(迁移数据库时下来,用正确的方法从一开始就这样做!)不要使用automigrations,这给了我的问题,在过去

这条线应该是在你的Global.asax:

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>()); 

而不是在你的DbContext!

其他提示,如果上面不会有帮助:

也许你有你的应用程序的多个层次:

Add-Migration 000 -StartupProjectName "NameOfTheProjectInSolutionExplorer" -ConfigurationTypeName "MyConfiguration" -ConnectionString "theconnectionstring;" -ConnectionProviderName "System.Data.SqlClient" -Verbose 

以上是外接迁移命令我使用的多层应用程序。

数据库的更新同样的事情

Update-Database -ConfigurationTypeName "SlaveConfiguration" -StartupProjectName "FacturatieMVCv2.Data" -Verbose -script 
22

可以重置实体框架来解决你的问题[但保持介意它会带来迁移到默认状态]

注意:在执行以下操作前进行备份

您需要删除当前状态:

  • 删除迁移文件夹在您的项目
  • 删除__MigrationHistory表在数据库中(可能是在系统表)

你会发现__MigrationHistory表在你的数据库[在App_Data文件夹]

然后在包管理器控制台运行以下命令:

Enable-Migrations -EnableAutomaticMigrations -Force 

使用带或不带-EnableAutomaticMigrations

最后,你可以运行:

Add-Migration Initial 

This may also help you

+1

你可能会发现这个相关答案有帮助:http://stackoverflow.com/a/17798015/97964有时你需要第二次迁移,或者你需要禁用在“初始”迁移中生成的代码。这里的关键是在最初的迁移中获得数据库的元数据,然后从那里开始。 – jocull 2016-04-28 17:44:28

+1

这应该是答案。 – Erdogan 2016-11-18 18:04:55

4

在我来说,我已经得到了同样的错误,因为我是在类的DbContext迫使ObjectContext.CommandTimeout在迁移期间的构造方法。

尝试删除它

((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 5000; 
+0

这很奇怪,但这也发生在我身上。 – bithavoc 2013-12-18 04:09:16

+0

您节省了我的一天先生 – user449689 2016-02-29 16:12:49

4

这为我工作:

update-database -targetmigration:"0" -force -verbose 
add-migration Initial 
update-database 
+1

我显然对EF来说太新了,无法理解解决方案。这是第二篇文章,建议使用“添加迁移”,但是......我在哪里输入此内容? – Jonathan 2017-06-19 13:45:46

+1

您可以在Visual Studio的“包管理器控制台”中执行此操作。查看命令列表:https://coding.abel.nu/2012/03/ef-migrations-command-reference/ – Robert 2017-06-20 14:29:11

相关问题