簡體   English   中英

無法將 Entity Framework Core 遷移添加到 .NET 標准 2.0 項目

[英]Can't add Entity Framework Core migrations to .NET Standard 2.0 project

我有很多項目的解決方案。 其中之一( Domain )是一個 .NET 標准 2.0 項目,我在其中創建了我想要啟用數據庫遷移的 EF Core DbContext實現。

我看到了各種博客和問答論壇,其中解釋了問題,但由於 .NET Core 較新版本或(可能)針對我的特定解決方案配置,建議的解決方案似乎都不適合我。

解決方案項目

  • 引擎(.NET Core 2.1 控制台應用程序)
  • Web API(.NET Core 2.1 庫)
  • 應用程序(.NET Core 2.1 庫)
  • 域(.NET Standard 2.0 庫)
  • WindowsService(.NET Core 2.1 控制台應用程序)

WindowsService是啟動項目,其中創建並封裝了Engine的實例以作為 Windows 服務或控制台應用程序運行(用於調試)。

Engine是真正的核心應用,其中Kestrel自托管 Web 服務器實例配置為 Web API 並實例化。 其他組件也被實例化並保持活動狀態(UDP 偵聽器、機器看門狗等)。

WebAPIStartup class 但沒有Program class,因為所有配置和 Web 服務器啟動都在Engine.Program.cs內完成。

依賴項

  • WindowsService => 引擎
  • 引擎 => WebAPI
  • WebAPI => 應用程序,域
  • 應用程序 => 域

第一次嘗試是簡單地從 PMC 啟動add-migration Initial ,以Domain項目為目標,但它變成:

無法創建類型為“MyDbContext”的 object。 將“IDesignTimeDbContextFactory”的實現添加到項目中,或參閱https://go.microsoft.com/fwlink/?linkid=851728了解設計時支持的其他模式。

然后我按照這個問題提出的解決方案,但是:

  1. add-migration Initial from PMC,將 My WebAPI (無Program類)設置為啟動項目后,變為:

    找不到任何兼容的框架版本找不到指定的框架“Microsoft.NETCore.App”,版本“2.1.0”。

    • 檢查應用程序依賴項並定位安裝在以下位置的框架版本:C:\Program Files\dotnet\
    • 安裝 .NET 核心先決條件可能有助於解決此問題: http://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409
    • .NET 核心框架和 SDK 可以從以下位置安裝: https://aka.ms/dotnet-download
    • 安裝了以下版本:2.0.5 在 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] 2.0.6 在 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] 2.0。 7 在 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] 2.0.9 在 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] 2.1.2 在 [C:\Program Files \dotnet\shared\Microsoft.NETCore.App]
  2. 在向域庫項目文件添加額外的目標框架( netcoreapp2.1 )后,來自 PMC add-migration Initial導致我出現與第一次嘗試相同的錯誤。

  3. 在添加對Microsoft.EntityFrameworkCore.SqlServer.Design v1.1.6的引用后,來自 PMC add-migration Initial總是導致與第一次嘗試相同的錯誤。

我應該怎么辦?

更新

這是刪除不必要的庫引用后的新Domain.csproj文件。

<ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.1.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.1.1" />
    <PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
</ItemGroup>

所有項目中的所有庫都是最新的。

  1. 這里下載並安裝適當的RuntimeSDK - 我想你現在需要.NET Core 2.1.302

  2. Microsoft.EntityFrameworkCore.SqlServer.Design不再需要,因為它包含在 SDK 中。 也不需要EntityFrameworkCorecsproj文件中的CLI參考。

  3. 確保您Manage NuGet packages window 顯示所有更新。

  4. 在您的任何地方添加 web 項目實現IDesignTimeDbContextFactory接口 - 它將自動找到並用於Package Manager Console中的 EF Add-Migration (或dotnet ef ... 類似物)命令

    public class DesignTimeActivitiesDbContextFactory: IDesignTimeDbContextFactory<ActivitiesDbContext> { public ActivitiesDbContext CreateDbContext(string[] args) { DbContextOptionsBuilder<ActivitiesDbContext> builder = new DbContextOptionsBuilder<ActivitiesDbContext>(); var context = new ActivitiesDbContext( builder.UseSqlServer("Data Source=(local)\LocalDB;Initial Catalog=DB_name;Integrated Security=True;").Options); return context; } }

要從appsettings配置文件中讀取連接字符串,您可以執行以下操作:

public class DesignTimeActivitiesDbContextFactory : IDesignTimeDbContextFactory<ActivitiesDbContext>
{
    public ActivitiesDbContext CreateDbContext(string[] args)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Path.Combine(Directory.GetCurrentDirectory()))
            .AddJsonFile("appsettings.Development.json", optional: false);

        var config = builder.Build();

        var optionsBuilder = new DbContextOptionsBuilder<ActivitiesDbContext>()
            .UseSqlServer(config.GetConnectionString("DefaultConnection"));

        return new ActivitiesDbContext(optionsBuilder.Options);
    }
}

注意:在上述代碼工廠中,將使用appsettings.Development.json文件中定義的連接字符串值。 連接名稱是DefaultConnection 換句話說,此設計時工廠用於Code First命令,如Add-MigrationUpdate-Database等...)並將它們應用於為Development環境配置的數據庫連接。

csproj庫的 csproj 文件應至少包含此 package。 確保您的版本與您的所有 Microsoft 軟件包匹配。 2.1.02.1.1 (此時最新)

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.1.1" />
  </ItemGroup>

</Project>

Package Manager Console中,將默認項目設置為您想要遷移的 class 庫。 它是控制台 window 右上角的下拉菜單。 另外,請確保您的啟動項目是具有數據庫連接信息的項目。

如果啟動項目沒有您想要搭建的DbContext實例,您將收到錯誤消息,因為它不知道如何實現DbContext 您應該在Startup.cs中注冊DbContext ,如下所示:

services.AddDbContext<MyDbContext>(options => options.UseSqlServer(connectionString));

然后,運行命令Add-Migration InitialCreate 這將為您的遷移搭建腳手架,它應該向您的 class 庫添加一個文件夾。

之后,運行Update-Database ,它應該應用遷移。

如果您仍然有問題。 確保您運行的是最新的 SDK。 https://www.microsoft.com/net/download

更多信息可以在文檔中找到。 https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/

暫無
暫無

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

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