2017-08-07 202 views
0

我在實體框架中使用Code First方法。如何刪除和創建僅在Code First - Entity Framework中更改的表格

我已經創建瞭如下的自定義數據庫初始值設定項。

public class CustomInit : IDatabaseInitializer<APIContext> 
    { 
     public void InitializeDatabase(APIContext context) 
     { 
      bool dbExists; 

      dbExists = context.Database.Exists(); 

      if (dbExists) 
      { 
       // remove all tables 
       context.Database.ExecuteSqlCommand(
        "EXEC sp_MSforeachtable @command1 = \"DROP TABLE ?\""); 

       // create all tables 
       var dbCreationScript = ((IObjectContextAdapter) 
         context).ObjectContext.CreateDatabaseScript(); 
       context.Database.ExecuteSqlCommand(dbCreationScript); 

       context.SaveChanges(); 
      } 
      else 
      { 
       throw new ApplicationException("No database is present"); 
      } 
     } 
    } 

根據上面的代碼,數據庫中的所有表都被刪除並重新創建。

我需要做的是刪除並創建表/實體,在代碼 變了樣 - 添加或刪除任何列等

反正我們能做到這一點?

任何指導,非常感謝。

+0

爲什麼不使用[遷移](https://msdn.microsoft.com/en-us/library/jj591621(v = vs.113).aspx)? –

+0

@ IvanR.I從未使用遷移。如果你能指導我如何實現遷移來找到我的問題的解決方案,那就太好了。謝謝 –

回答

1

您可以使用migrations更新數據庫方案。

  1. 打開包管理器控制檯(工具 - >庫包管理器 - >程序包管理器控制檯)
  2. 運行啓用遷移命令
  3. 更改模型
  4. 運行添加遷移命令在包管理器控制檯中。
  5. 運行更新數據庫命令將您的模型更改應用於數據庫。

當然,你不應該使用你的自定義數據庫初始值設定項。

+0

添加到您的答案。要使初始遷移工作,您的數據庫應該爲空/未創建。 –

0

最簡單的解決辦法是這個初始化添加到您在您的上下文的構造函數:

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

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

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

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

被告知,沒有這些工作,在實體框架的核心,因爲微軟沒有也不打算實施.Net Core版本的自動遷移。

+0

我試過這個。但現在的變化並沒有反映在數據庫中。我添加了新的實體,但表不是爲實體創建的。 –

+0

當我執行項目時,它會拋出錯誤說「數據庫中已經有一個名爲'xyz'的對象。」 –

+0

@DheerajKumar修改現有實體是否工作?我認爲這些初始化只更新現有的表,但不創建新的表。 – stybl

0

您可以恢復到通過更新數據庫應用的初始遷移。

更新數據庫-targetMigration「MigrationName」

上面的命令恢復無論你已經申請爲EF遷移的一部分,所有的數據庫變化。

相關問題