繁体   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