2012-03-26 140 views
10

我正在嘗試執行本教程http://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/getting-started-with-mvc3-part4-cs,而不是使用精簡版的SQL Server,我在本地機器上使用完整安裝。我閱讀本教程的方式是實體框架假設從我定義的對象中創建表。我的問題是,當我運行該項目時,我不斷收到無效的對象名稱dbo.movi​​es。我終於通過自己創建表來運行它,所以我知道連接字符串,並且一切都是正確的。從對象,實體框架自動創建數據庫表

我的問題是,是否有可能從C#中創建的對象生成表,如果是這樣的話?

回答

19

是否有可能從C#中創建的對象生成表?

是的,這是可能的。在運行代碼之前,您是否碰巧在Management Studio中手動創建數據庫?這可能是你的問題。使用Code First時,默認約定是創建數據庫,如果數據庫不存在。如果數據庫已經存在(即使沒有表),那麼它將只使用現有的數據庫(但不會嘗試創建表)。

您可以刪除數據庫並再次嘗試運行代碼,看它是否會爲您創建它或將在Global.asax中以下行:

Database.SetInitializer(new DropCreateDatabaseAlways<YourDbContextHere>()); 

一旦它運行的話,我會建議改變該行:

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<YourDbContextHere>()); 

這些命名空間是在System.Data.Entity

定義的DbContext類也公開了一個數據基礎屬性,它定義了以下有用的方法:

Delete() 
Create() 
CreateIfNotExists() 

所以,如果你確定你的類像這樣:

public class MyContext : DbContext {} 

您可以構建一個實例,像這樣:

MyContext db = new MyContext(); 
db.Database.Delete(); 
db.Database.Create(); 
+0

嗯,我想如果沒有初始數據庫連接到連接字符串,我想什麼?我只是從它刪除最初的目錄片斷並收到相同的無效對象名稱'dbo.Movies'錯誤。 – Pieces 2012-03-26 14:31:46

+0

連接字符串告訴它在哪裏創建數據庫。它不一定存在。它會檢測到它不存在,然後嘗試創建它,如果它不存在。只要它具有正確的權限,一切都會創建正常。我想如果你刪除數據庫並保留相同的連接字符串,那麼一切都將以你想要的方式工作。 – Dismissile 2012-03-26 14:33:23

+0

哦,非常感謝你!最後一個問題是,您建議將Database.SetInitializer放在哪個方法中。我得到一個錯誤,它無法刪除數據庫,因爲它正在使用中。我會通過應用程序來推測它的自我。再次感謝,我的朋友和我花了很多時間尋找解決問題的方法,並且從來不會猜測數據庫不應該被創建。 – Pieces 2012-03-26 14:38:07

0

如果創建一個Linq到SQL的DataContext,您可以直接將結構注入數據庫蒙山:

DbDataContext db = new DbDataContext(connectionString); 
db.CreateDatabase(); 
+1

他正在使用實體框架DbContext,而不是Linq-to-SQL – Dismissile 2012-03-26 14:37:43

0

我不知道這是否是猶太教,但使用代碼優先的EF,當我使用AddRange時,EF通常會創建我定義的所有表。我想保留數據庫,因爲我想在應用程序運行之間保留其他表。我發現如果我沒有刪除創建名爲__MigrationHistory的表EF,它們在被刪除後不會被重新創建。

一旦我刪除了這個表,那麼EF將重新創建表而不必重新創建數據庫。

這可能不是一個明智的生產方式,但對於我的發展需要,這解決了我的問題。也許它會幫助別人。

0

您可以使用FenixRepo庫(也可作爲nuget package)創建特定的表格,這是您的一部分Context。首先,您應該在啓動時調用一次staticInitialize方法,其中第一個參數是工廠方法,它返回您的Context的實例,第二個參數是Configurationclass的實例。它將爲您的所有表格準備SQL腳本,在Context處註冊。在ASP.NET MVC的情況下,它是一個很好的決定,將此代碼粘貼到Global.asax中:

FenixRepositoryScriptExtractor.Initialize(() => new Context(), new Configuration()); 

然後你就可以創建所需的類型MyTable這種簡單的方式表:

var repo = new FenixRepositoryCreateTable<MyTable>(); 
//or repo = new FenixRepository<MyTable>(); 

repo.CreateTable(); 

而且,如果你的表格在多個遷移之間傳播,並且他們沒有任何東西與其他表格相對應,則可以通過FenixAttribute指定這些遷移(即遷移文件夾中的類別名稱),並且它們將被用作SQL腳本的來源,用於創建表格:

[Fenix(nameof(Initial), nameof(MyTableFirstMigration), nameof(MyTableSecondMigration))] 
public class MyTable 
{ 
    //some stuff 
} 

沒有此屬性,庫將使用默認腳本。指定遷移總是比較好,因爲否則不能保證所有索引都將創建,並且在遷移過程中,您可以包含一些自定義代碼,在默認解決方案的情況下不會執行。

庫在MS SQL的情況下與EF 6.1.3兼容和測試。

-1
ModelContext.Database.EnsureCreated(); 
+0

請解釋你的問題。 – 2018-01-06 13:45:35