2015-02-09 30 views
0

我不明白爲什麼在運行update-database命令時會創建另一個數據庫,而不是將未決遷移應用到現有數據庫。這種情況似乎偶爾發生。這些是我習慣遷移時使用的陡峭:EF創建另一個數據庫,而不是將遷移應用到現有數據庫

  1. 將包管理器項目設置爲MySolution.MyProject;
  2. 運行update-database命令。它偶爾創建一個新的數據庫與我的上下文全班名稱,例如:MySolution.MyProject.MyContext;
  3. 在SQL Server Management Studio上,我刪除了新創建的數據庫MySolution.MyProject.MyContext;
  4. 再次運行相同的命令update-database。然後,EF正確找到我的數據庫,其名稱爲onlyMyContext並且僅應用待處理的遷移。

最後一步是最初的預期結果。我想了解:爲什麼這是另一個數據庫正在創建? EF在第一次運行時不應該找到正確的名稱嗎?爲什麼我第二次運行時運行正常?我一定在做一些非常錯誤的事情。

這裏是我的遷移項目,這是MySolution.MyProject.MyContext的app.config文件:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    ... 
    <configSections> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    </configSections> 
    <connectionStrings> 
    <add name="MyContext" connectionString="Data Source=.\SQLDEV;Initial Catalog=MyContext;Persist Security Info=True;User ID=my_user;Password=my_password;Pooling=False;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 
    </entityFramework> 
    ... 
</configuration> 

我給數據庫用戶的所有特權我的機器(SQL用戶>服務器角色)上。

這我的文件MyContext.cs

namespace MySolution.MyProject 
{ 
    public class MyContext : DbContext 
    { 
     public MyContext() 
     { 
      this.Configuration.LazyLoadingEnabled = false; 
     } 

     public MyContext(string nameOrConnectionString) 
      : base(nameOrConnectionString) 
     { 
     } 

     public MyContext(DbConnection existingConnection, bool contextOwnsConnection) 
      : base(existingConnection, contextOwnsConnection) 
     { 
     } 

     public MyContext(ObjectContext objectContext, bool dbContextOwnsObjectContext) 
      : base(objectContext, dbContextOwnsObjectContext) 
     { 
     } 

     // ... lots of stuff... 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 

      base.OnModelCreating(modelBuilder); 
     } 
    } 
} 

我如何能理解/調試/找出發生了什麼事是知道的任何建議。

+0

你可以做的一件事是當你更新數據庫時使用'-verbose'開關。我總是使用它,因爲它讓你看看EF實際上在做什麼。 – DrewJordan 2015-02-09 14:08:34

+0

@DrewJordan謝謝!這有幫助! – rodrigogq 2015-02-09 15:59:49

+1

好!如果你發現你的問題,你應該回到這裏作爲回答,幫助其他可能遇到同樣問題的人。 – DrewJordan 2015-02-09 16:01:32

回答

0

正如@DrewJordan指出的那樣,使用-verbose明確地告訴我什麼是問題。

因爲我有一個大的解決方案(幾個項目)工作,並且每個項目都有自己的app.config(其中大部分沒有EF連接),我檢查了詳細顯示:

PM> update-database -verbose 
Using StartUp project 'MySolution.Business'. 
Using NuGet project 'MySolution.MyProject'. 

而不是在包管理器控制檯中選擇Default ProjectMySolution.MyProject,我不得不。然後它正常工作,因爲它指向正確的app.config與我的EF連接。

我仍然不知道爲什麼第二次運行正常,但它似乎與我最終點擊MySolution.MyProject的事實有關,當它變成粗體時,啓動項目將被正確設置爲正確的app.config文件。

+0

啊,是的,這是我的預感...事實上,我發現我必須同時做兩個(在解決方案資源管理器中設置爲啓動項目),並從包管理器控制檯中的下拉列表中設置默認項目。肯定你選擇這個答案爲'接受',所以它不會顯示爲'未答覆'了。 – DrewJordan 2015-02-09 16:15:23

相關問題