2016-07-22 71 views
4

我試圖在數據存儲庫中使用實體框架核心,但我無法讓EF創建數據庫。實體框架構建存儲庫時的核心工具

在以前的EF版本中,它都是自動發生的,如果EF在第一次嘗試對數據執行任何操作時不存在,EF會創建數據庫。

現在,我在文檔上看到了使用EF遷移的說明。該指令是安裝的依賴和工具:

  • Microsoft.EntityFrameworkCore.Design
  • Microsoft.EntityFrameworkCore.Tools

,並與dotnet ef database update一起運行dotnet ef migrations add MigrationName

現在來了這件事。在構建存儲庫時,我有一個項目AppName.Data(其中存儲庫已實施)和一個項目AppName.WebApi(其中存儲庫已耗盡)。

如果我嘗試添加工具並從AppName.Data運行dotnet ef它不起作用,因爲AppName.Data是一個庫。該錯誤消息表示該工具只能用於一個可執行應用程序的上下文中。

接下來的嘗試是從AppName.WebApi運行dotnet ef,這是可執行的。現在dotnet ef的作品,但如果我嘗試dotnet ef migrations add InitialMigration創建數據庫我得到一個錯誤,因爲DbContext不在AppName.WebApi項目,但在另一個項目。

我真的不知道該怎麼做。因此,如果我想讓EF創建數據庫以及所有這些,並且我想使用存儲庫,那麼對於可執行項目沒有EF特定的代碼,我該怎麼做?

+0

在程序包管理器控制檯中,指向applicationdbcontext所在的項目,然後運行它。 – Thennarasan

回答

1

經過搜索後,我在the docs的「預覽2已知問題」中發現,這是目前這些工具的侷限性。它確實需要一個可執行應用程序項目才能運行,因爲它需要使用dotnet run

該文檔還提供瞭解決方法。第一個解決方法就是我最喜歡的那個爲我工作的人。我們只需指向一個可執行應用程序項目,該項目將通過項目的路徑--startup-project

所以不是運行

dotnet ef migrations add MigrationName 

我們經營

dotnet ef --startup-project pathToProject migrations add MigrationName 

,一切都按預期工作。

0

或者在你的倉庫,你可以將下面的代碼添加到您的DbContext類:

public InviteesDbContext(bool recreate = false) 
    { 
     if (recreate) 
     { 
      recreateDatabase(this); 
     } 
    } 

    private static void recreateDatabase(InviteesDbContext dbContext) 
    { 
     dbContext.Database.EnsureDeleted(); 
     dbContext.Database.EnsureCreated(); 

     setPermissions(dbContext); 
     seed(dbContext); 
    } 

要激活這個代碼,並重新(創建)你隨意數據庫,在控制檯項目添加到該解決方案包括你的datarepository項目使用這個代碼。

static void Main() 
    { 
     using (InviteesDbContext dbContext = new InviteesDbContext(false)) 
     { 
      Console.WriteLine("Database in existence or created"); 
      Invitee invitee = dbContext.Invitees.Where(i => i.Id == 1).SingleOrDefault(); 
      if (invitee != null) 
      { 
       Console.WriteLine("Invitee " + invitee.Id.ToString() + " found !!"); 
      } 
      Console.ReadKey(); 
     } 

    } 

如果暫時變化

using (InviteesDbContext dbContext = new InviteesDbContext(true)) 

和運行控制檯應用程序的數據庫將被重新(創建)。

警告:在數據庫定期更改並且潛在的數據丟失不是那麼重要時,僅在項目的早期階段使用此代碼。切勿在生產中使用此代碼。