2014-09-05 81 views
2

我試圖理解實體框架在引發我將要描述的觀察行爲的引擎蓋下做了什麼。實體框架代碼第一次自動創建表

這是一個ASP.NET MVC 4 Internet應用程序項目。

我已經在本地主機上現有的MSSQL數據庫稱爲wpdb

Web.config文件:

<add name="DefaultConnection" 
    connectionString="Data Source=localhost;Initial Catalog=wpdb;User=xxx;Password=xxx" 
    providerName="System.Data.SqlClient" /> 

當我第一次運行的Web應用程序,它會創建dbo.UserProfiledbo.webpages_Membership和其他幾桌自動神奇。

我創建了一個新的模式Comments.cs

public class Comment 
{ 
    public int ID { get; set; } 
    public string Text { get; set; } 
} 

public class CommentDBContext : DbContext 
{ 
    public DbSet<Comment> Comments { get; set; } 
} 

我添加了一個新的控制器CommentsControllerMVC控制器的讀/寫操作和視圖,使用實體框架(並選擇我的「註釋」和「CommentDBContext」類)。

然後我添加一個新的連接字符串(即最終被無效顯然是實體框架的默認連接字符串不是「DefaultConnection」但事情,我不知道爲什麼)。

<add name="CommentDbContext" 
    connectionString="Data Source=localhost;Initial Catalog=wpdb;User=xxx;Password=xxx" 
    providerName="System.Data.SqlClient" /> 

現在,當我瀏覽到localhost/Comments實體框架自動神奇地在我的數據庫稱爲dbo.Comments創建一個新表。到目前爲止,我所描述的

一切是完全符合市場預期,這裏的地方是會很奇怪

我不小心刪除dbo.Comments。但是,這次當我瀏覽到localhost/Comments實體框架將不會重新創建表。相反,它會向我拋出一個「無效的對象'dbo.Comments'」錯誤。

它爲什麼這樣做?爲什麼不重新創建數據庫?我甚至嘗試刪除所有的模型/控制器/視圖代碼,清理/重建解決方案,然後重新創建它,EF仍然拒絕重新創建表!

什麼是更加混亂,如果我在Web.config文件註釋掉CommentDbContext線(這樣EF代碼試圖連接到錯誤的數據庫),然後運行該應用程序並瀏覽到/Comments,然後終止該應用中,取消連接字符串,這次它創建一個全新的dbo.Comments表沒有任何問題!

爲什麼改變則連接字符串的東西無效,那麼改變它回到允許EF從我的模型再次生成的表?似乎有一些狀態被保存在某處它不應該是..

回答

2

我不小心刪除了dbo.Comments。它拋出一個「無效的對象'dbo.Comments'」錯誤在我身上。它爲什麼這樣做?

因爲您不想按照配置方式編輯/刪除表格。這不是同步模型和模型的數據庫更改自動奇蹟般地到數據庫。

爲什麼不重新創建數據庫?

因爲你沒有自動告訴它,也沒有你問過它。

爲什麼改變連接字符串爲無效然後改回它允許EF從我的模型再次生成表?

因爲它創建了一個表(它忘記了名字),它知道它最後一次同步以及它有哪些表並且沒有創建表。當您將連接字符串更改爲不具有該表的其他數據庫時,它會重新創建所有內容。

你或許應該看一看MSDN上的以下文章,並選擇你想怎麼實體框架,爲您的方案工作:

Code First Migrations

+0

'因爲它創建一個表(忘了名字),它知道「我想更多地瞭解這一點。你能把我鏈接到一些文檔嗎? – Dan 2014-09-05 20:25:31

+1

我認爲這個錯過的一件事是:當他將它改回原始連接字符串時,爲什麼決定創建缺少的表?爲什麼在根本不弄錯連接字符串之前沒有檢測到丟失的變化?我懷疑它只在應用程序啓動時檢查實體模型,並且因爲它是一個MVC應用程序,所以直到改變了webconfig才啓動。我懷疑他可能剛剛循環使用應用程序和/或IIS,並且它會自動重新創建表,而不會干擾連接字符串。 – AaronLS 2014-09-05 20:27:29

+0

無論如何,如果DbContext的每個實例都必須執行完整的模式比較才能確定模型已更改,那將非常昂貴。不是對你的出色答案的批評,只是對OP的一些見解,他們爲什麼不在應用程序運行時自動執行此操作。 – AaronLS 2014-09-05 20:29:20