4

VS 2013 MVC5代碼第一個項目。EF6遷移(LocalDb)更新數據庫登錄失敗

我正在通過ASP.NET Getting Started with EF6 using MVC5教程來了解最新的更改,並且遇到了遷移問題。 在第一個模塊的數據庫使用創建的數據庫初始化:

<contexts> 
     <context type="ContosoUniversity.DAL.SchoolContext, ContosoUniversity"> 
     <databaseInitializer type="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity" /> 
     </context> 
</contexts> 

與此連接字符串:

<connectionStrings> 
    <add name="SchoolContext" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=ContosoUniversity1;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/> 
</connectionStrings> 

這工作得很好。在代碼優先遷移和部署模塊遷移設置。初始值將被註釋掉和數據庫的名稱更改爲ContosoUniversity2:

<connectionStrings> 
    <add name="SchoolContext" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=ContosoUniversity2;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/> 
</connectionStrings> 

update-database然後從包裝程序管理器控制檯運行失敗,出現錯誤消息:

Cannot open database "ContosoUniversity2" requested by the login. The login failed. 
Login failed for user 'MyMachine\MyUser'. 

我已經用相同的用戶和相同的結果重複運行這兩種情況。如果我改變Initial CatalogAttachDbFilename=|DataDirectory|\ContosoUniversity2;update-database成功(數據庫目前正處於項目的應用程序,數據文件夾,而用戶的根目錄配置文件):

<connectionStrings> 
    <add name="SchoolContext" connectionString="Data Source=(LocalDb)\v11.0; AttachDbFilename=|DataDirectory|\ContosoUniversity2;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/> 
</connectionStrings> 

你雖然部署時使用Initial Catalog。生產connectionString在Web.Release.Config中單獨設置,以便可行。

問題是爲什麼需要修復,爲什麼Initial Catalogupdate-database在開發方面的工作?

更新1:

的問題是不是與遷移,但與LocalDb

MyUserSQLExpresssysadmin)全部權利。我可以在MyUser下登錄SSMS並完全管理DBs。我跑了幾次測試。儘管我爲本教程創建了初始數據庫,如MyUser,但如果我從頭開始重建應用程序並使用databaseInitialzer,它現在會引發登錄失敗錯誤。如果我在Admin下運行VSdatabaseInitialzerupdate-database都可以正常工作。如果我那麼DBsAdmin's用戶配置文件根目錄複製到MyUser's然後運行VS,還不如Admin,登錄時爲MyUser兩個databaseInitialzerupdate-database然後工作,如果DB是之前已有。

如果我改變connectionStringAttachDbFileName和運行或者databaseInitialzerupdate-databaseMyUser可以在App_Data文件證明MyUserDB創建權限創建DBMyUser顯然對其自己的用戶配置文件的根有充分的權利。 LocalDb實現有一些問題。

有沒有人有任何關於這個問題的見解?

+0

你有SQL Server Management Studio嗎?如果是,請嘗試使用Windows身份驗證連接到兩個數據庫。如果你可以(沒有訪問錯誤),這是代碼相關的東西。如果沒有,這是localdb中需要更改的配置設置。 –

回答

13

如果您刪除數據庫文件,它仍然保持註冊SqlLocalDB。如果LocalDb掛掉了無法連接(手動刪除數據庫文件後)或登錄失敗,請參閱JSobell's和CodingwithSpike的答案:

ef5-cannot-attach-the-file-0-as-database-1

運行「sqllocaldb.exe停止V11.0」和「sqllocaldb.exe刪除V11.0」從PM控制檯

UPDATE:

還更容易使用SSMS。服務器名稱:(本地)\ v11.0,Windows身份驗證。這實際上是管理localdb數據庫的最佳方式。

5

我正在使用VS 2013和EF6.1。

當我使用遷移和刪除數據庫時,出現類似的錯誤。 我無法再重新創建數據庫。 發現由於SQLExpress本地數據庫實例導致的錯誤正在後臺運行,並保留與其刪除的數據庫連接。

以下是處理這種情況的步驟。

  1. 刪除數據庫文件(.mdf和.ldf)文件。
  2. 從您的應用程序中刪除遷移文件夾。
  3. 從服務器資源管理器數據連接中刪除與該數據庫的任何數據庫連接。
  4. 轉到Windows命令提示符(IF VS 2012或更早版本,您必須使用VS命令提示符)。
  5. 運行 「sqllocaldb.exe停止V11.0」(這將停止V11.0服務)
  6. 運行 「sqllocaldb.exe刪除V11.0」(這將刪除V11.0服務)
  7. 圍棋到Visual Studio中的包管理器控制檯。
  8. 運行「允許的遷移」(這將創建遷移文件夾和內容)
  9. 運行「添加 - 遷移初始化」(這將腳手架的改變下一個遷移)
  10. 運行「更新-數據庫」(這將創建
1

交換從連接字符串

數據源=(的LocalDB)\ V11.0再次數據庫);

服務器=。\的SQLExpress;

這種遷移

0

過程中幫助過我的代碼第一次技術這將解決您的問題,您可以更新和儘可能多的方法和屬性,只要你想

註釋添加到模型:第1步{如果你開始作爲DATABSE在本教程}

從PM控制檯:

  1. 啓用的遷移-ContextTypeName ContosoUniversity.DAL.SchoolContext

  2. 附加遷移初始

  3. 更新數據庫

0

我有點晚,但我也遇到同樣的問題,而這樣做Getting Started with EF6 using MVC5

該問題出現是由於示例中數據庫初始化無效。

變化

public class SchoolInitializer : System.Data.Entity. DropCreateDatabaseIfModelChanges<SchoolContext> 

public class SchoolInitializer : CreateDatabaseIfNotExists<SchoolContext> 

,它會創建一個沒有問題的數據庫。

本示例中使用的初始化方法默認情況下不會創建新的數據庫。不知道它是否是一個錯誤。

+0

我在閱讀該教程時遇到了同樣的錯誤。在第一篇教程/初始步驟中已經指出,每次運行應用程序時都會重新創建數據庫,並且在接下來的步驟中會進行更改。對於仍處於初始步驟中的用戶,您只需斷開服務器資源管理器中的LocalDb,即可查看Student表中的新電子郵件列。但是,@Daniil Ivanov的建議也適用。 –

相關問題