2017-07-17 89 views
1

使用實體框架核心,有沒有辦法創建表,如果它還不存在?異常將拋出即使EnsureCreated是所謂的背景:創建一個表,它不存在?

DbSet<Ticker> Ticker { get; set } 
Database.EnsureCreated(); 

Ticker.Add(...); 
dbctx.SaveChanges(); <== exception 

結果異常:

System.Data.SqlClient.SqlException:無效的對象名稱股票代碼「

是有數據插入之前創建表Ticker的方法嗎?

== ==編輯

這個問題是不是要創建/遷移整個數據庫,該數據庫總是存在的,它的大多數表還存在,但一些表可能不會。所以我只需要在運行時創建一個或兩個表。

+0

的可能的複製[檢查表存在於使用LINQ的數據庫中](https://stackoverflow.com/questions/5218489/check-if-a-table-exists-within-a-database-using-linq) – Guy

+0

@Guy所以你建議有沒辦法做到這一點? – fluter

+0

我建議你可以檢查表是否存在,如果不存在,就創建它。 – Guy

回答

0

是的,有。使用EFCore,一旦模型完成,您需要使用遷移來創建數據庫。對於更詳細的介紹,請看看這兩個教程:

tutorial 1

tutorial 2

4

您在這裏有幾個選項。最簡單的是做:

MyContext.Database.CreateIfNotExists(); 

或者說,它初始化的風格,通過把這個在您的上下文的構造函數:

Database.SetInitializer<MyContext>(new CreateDatabaseIfNotExists<MyContext>()); 

這兩種但是需要你每次你有時間手動刪除您的架構修改你的模型並需要重新創建數據庫。如果你不想做,你可以使用下面的初始化,而不是:

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

這將在每次運行程序時檢查你的模型對數據庫,並自動刪除並重新創建數據庫,如果該模型已被修改。

編輯:

如果你不想刪除數據庫,並只對其進行更新,那麼你可以使用下面的初始化:

Database.SetInitializer<MyContext>(new MigrateDatabaseToLatestVersion<MyContext, Config>()); 
+1

我沒有創建數據庫,數據庫始終存在,我只需要創建一個表,如果表不存在。 – fluter

+0

@fluter檢查編輯。 – stybl

+1

謝謝,但是當我嘗試你的例子時,EFCore中不存在'SetInitializer'方法:https://docs.microsoft.com/en-us/ef/core/api/microsoft.entityframeworkcore.infrastructure.databasefacade# Microsoft_EntityFrameworkCore_Infrastructure_DatabaseFacade – fluter

相關問題