[英]Can't enable migrations for Entity Framework on VS 2017 .NET Core
[英]Can't add Entity Framework Core migrations to .NET Standard 2.0 project
我有很多项目的解决方案。 其中之一( Domain
)是一个 .NET 标准 2.0 项目,我在其中创建了我想要启用数据库迁移的 EF Core DbContext
实现。
我看到了各种博客和问答论坛,其中解释了问题,但由于 .NET Core 较新版本或(可能)针对我的特定解决方案配置,建议的解决方案似乎都不适合我。
解决方案项目
WindowsService
是启动项目,其中创建并封装了Engine
的实例以作为 Windows 服务或控制台应用程序运行(用于调试)。
Engine
是真正的核心应用,其中Kestrel
自托管 Web 服务器实例配置为 Web API 并实例化。 其他组件也被实例化并保持活动状态(UDP 侦听器、机器看门狗等)。
WebAPI
有Startup
class 但没有Program
class,因为所有配置和 Web 服务器启动都在Engine.Program.cs
内完成。
依赖项
第一次尝试是简单地从 PMC 启动add-migration Initial
,以Domain
项目为目标,但它变成:
无法创建类型为“MyDbContext”的 object。 将“IDesignTimeDbContextFactory”的实现添加到项目中,或参阅https://go.microsoft.com/fwlink/?linkid=851728了解设计时支持的其他模式。
然后我按照这个问题提出的解决方案,但是:
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]
在向域库项目文件添加额外的目标框架( netcoreapp2.1
)后,来自 PMC add-migration Initial
导致我出现与第一次尝试相同的错误。
在添加对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>
所有项目中的所有库都是最新的。
从这里下载并安装适当的Runtime
和SDK
- 我想你现在需要.NET Core 2.1.302
Microsoft.EntityFrameworkCore.SqlServer.Design
不再需要,因为它包含在 SDK 中。 也不需要EntityFrameworkCore
的csproj
文件中的CLI
参考。
确保您Manage NuGet packages
window 显示所有更新。
在您的任何地方添加 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-Migration
、 Update-Database
等...)并将它们应用于为Development
环境配置的数据库连接。
csproj
库的 csproj 文件应至少包含此 package。 确保您的版本与您的所有 Microsoft 软件包匹配。 2.1.0
或2.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.