6

今天是一個悲傷的一天。今天我首先看到了EF異常,說「自從創建數據庫以來,支持'DomainContext'上下文的模型已經改變了。」「。這是接近午夜,我仍然看到這個錯誤。這是我職業生涯的終點 - (實體框架創建空遷移,但堅持我的模型是不同的

我敢肯定沒有在模式發生了變化,沒有出現錯誤我試圖創建一個新的遷移,就出來了空:

public void Up() 
{ 
} 
public void Down() 
{ 
} 

應用這種遷移並沒有任何好處 - 錯誤堅持我用共同建議設置初始化劑爲空:。

Database.SetInitializer<DomainContext>(null); 

,這讓錯誤消失,當我訪問數據庫,但這些問題影響我非常多 - 每當我嘗試通過代碼運行遷移時,我都會看到simil再次AR錯誤:

var configuration = new Migrations.Configuration(); 

configuration.TargetDatabase = new DbConnectionInfo("correct connection string", "System.Data.SqlClient"); 

var migrator = new DbMigrator(configuration); 

migrator.Update(); // <<-- exception is thrown here 

例外扔如下:System.Data.Entity.Migrations.Infrastructure.AutomaticMigrationsDisabledException:無法更新數據庫,因爲有掛起的更改,並自動遷移到當前的匹配模型被禁用。將掛起的模型更改寫入基於代碼的遷移或啓用自動遷移。將DbMigrationsConfiguration.AutomaticMigrationsEnabled設置爲true以啓用自動遷移。

我已經更新到EF 6.1(在6.0.2之前),但這沒有什麼區別。

困擾我,我可以通過控制檯的NuGet運行遷移另一件事:

Update-Database 

運行良好,不給任何問題。但是,當我設置DB初始化器自動運行遷移:

var initializer = new MigrateDatabaseToLatestVersion<DomainContext, Migrations.Configuration>(); 
Database.SetInitializer(initializer); 
var domainContext = new DomainContext(); 
domainContext.Database.Initialize(true); // <<-- this throws exception 

無法更新數據庫,因爲有掛起的更改,並自動遷移到當前的匹配模型被禁用。將掛起的模型更改寫入基於代碼的遷移或啓用自動遷移。將DbMigrationsConfiguration.AutomaticMigrationsEnabled設置爲true以啓用自動遷移。

真正的問題是EF爲什麼在運行Nuget控制檯和通過Migrations DB-Initialiser運行時爲模型提供了不同的哈希值?我怎樣才能找出什麼是不同的(模型從數據庫狀態)?以及如何解決這個問題,所以我不必使用黑客(將空分配給db-initaliser)?

+0

你爲什麼不嘗試一個虛擬的變化?假設要在表中添加一個字段,並且看看EF在請求創建遷移時做了什麼,當然以後要刪除該字段。 –

+0

試過 - 在移民中只增加了那個領域,沒有其他的東西。我目前正在通過EF代碼,我想我找到了錯誤的原因。一旦我修復它,我會發布一篇博客文章。可以對其他人有用。 – trailmax

+1

@Guillelon發現問題 - 這是屬性[AllowHtml]應用於模型的一個屬性。 – trailmax

回答

6

我的問題的原因是一個[AllowHtml]屬性應用於其中一個模型。在將MVC更新爲5.1.1並將WebApi更新爲2.1後,問題開始發生。

我已經從EF模型中刪除了該屬性,並剝離並重新構建數據庫,問題消失了。

我已經寫了關於如何調試這種問題的博客帖子:http://tech.trailmax.info/2014/03/inside_of_ef_migrations/

而且我覺得這[AllowHtml]屬性是一個錯誤,我將創建一個可重複的解決方案,將提交錯誤報告EF-人。

更新:我實際上不能再現錯誤。類屬性上的[AllowHtml]屬性與它無關。這是一個神奇的故障。

+0

只是好奇,如果你發佈這個信息與EF的人,如果是的話,他們的反饋是什麼。 – Kixoka

+0

@Kevin我實際上無法在空白解決方案上重新創建相同的問題。所以沒有報告任何地方 – trailmax

+0

這似乎是在https://entityframework.codeplex.com/workitem/2167;評論提到應用空遷移來更新模型狀態,該狀態在6.1中添加。並且不存在於以前的版本中。 – Patrick

0

今天我有同樣的問題。 我在問題出現之前添加了ViewModel,View和Html.EnableClientValidation()

根本沒有Model更改! 我做了一個虛擬更改,就像@Guilleon建議的那樣,並創建了一個工作遷移...但它沒有幫助。

然後我重新啓動Visual Studio,一切都重新開始。 這一定是一個小故障