簡體   English   中英

構建存儲庫時的實體框架核心工具

[英]Entity Framework Core tools when building a repository

我正在嘗試在數據存儲庫中使用Entity Framework Core,但是我很難讓EF創建數據庫。

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

現在,我在文檔中似乎有使用EF遷移的指令。 說明是安裝依賴項和工具:

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

要運行dotnet ef migrations add MigrationNamedotnet 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特定代碼 ,我該怎么辦?

在搜索之后,我在文檔上找到了“預覽2已知問題”,這是目前工具的限制。 它確實需要一個可執行的應用程序項目才能運行,因為它需要使用dotnet run

文檔還提供了解決方法。 我首選的並且對我有用的是第一個解決方法。 我們只是指向一個可執行的應用程序項目,它通過--startup-project的路徑傳遞--startup-project project。

所以不要跑步

dotnet ef migrations add MigrationName

我們跑

dotnet ef --startup-project pathToProject migrations add MigrationName

一切都按預期工作。

或者,在您的存儲庫中,您可以將以下代碼添加到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))

並運行控制台應用程序將重新創建(創建)數據庫。

警告 :只有在數據庫定期更改且數據可能丟失不那么重要的情況下,才在項目的早期階段使用此代碼。 切勿在生產中使用此代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM