问题 尝试在.Net Standard项目中设置Entity Framework核心


我想知道我是否可以轻松地在.NET Standard 2.0项目中设置我的EntityFrameworkCore。我跟着这个 教程 但它需要.NET Core或Framework。

当我到达这一步时:

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

我收到了这个错误:

启动项目'projectName'的目标是框架'.NETStandard'。没有与此框架关联的运行时,并且无法直接执行以其为目标的项目。要将Entity Framework核心软件包管理器控制台工具与此项目一起使用,请添加一个针对引用此项目的.NET Framework或.NET Core的可执行项目,并将其设置为启动项目;或者,更新此项目以跨目标.NET Framework或.NET Core。

我想知道我是否可以在.NET Standard中设置我的实体,或者是否有我应该做的最佳实践?


2992
2018-02-07 22:00


起源

看一下这个。还要确保你的.csproj <TargetFramework>netstandard2.0</TargetFramework> 而你正在使用 Install-Package Microsoft.EntityFrameworkCore.SqlServer -Version 2.0.0 - Matthew Alltop
我仍然得到相同的错误,我安装了Microsoft.EntityFrameworkCore.SqlServer 2.0.1,如果这有所作为 - Joe Jazdzewski


答案:


启动项目'projectName'的目标是框架'.NETStandard'。没有与此框架关联的运行时,并且无法直接执行以其为目标的项目。要将Entity Framework核心软件包管理器控制台工具与此项目一起使用,请添加一个针对引用此项目的.NET Framework或.NET Core的可执行项目,并将其设置为启动项目;或者,更新此项目以跨目标.NET Framework或.NET Core。

错误消息意味着:没有这样的东西 可执行 .NET标准项目。它没有运行时,因为它只是一个用于多个不同运行时的类型转发机制。

在编程术语中,它是 有点像尝试实例化一个接口。你不能这样做,因为没有实现可以运行。

解决方案是选择一个 可执行平台 为您的应用程序运行。您可以从exectuable中引用任意数量的.NET标准库(只要它们与您的运行时兼容),但是可执行文件本身不能在.NET Standard上运行。它必须以.NET Framework或.NET Core等平台为目标才能执行。

换句话说,为了使用命令来构建数据库,您必须以运行时为目标。因此,您需要在定位主可执行项目时运行此命令,或者在解决方案中添加新的可执行项目以运行它。


9
2018-02-07 22:33



我在解决方案中添加了一个.NET CORE控制台应用程序,能够以.NET Standard项目为目标继承模型 - Joe Jazdzewski
我得到了这个的要点,但它对我来说仍然有点直观。如果我对.NETStandard项目运行ef命令,它应该能够看到并处理这种情况。可执行框架可以是应该生成相同的代码,对吧?无论如何,要添加答案,您可以使用Project和StartupProject开关进行修复:add-migration“some migration”--Project Some.NetStandard.Data -StartupProject SomeNetFrameworkOrNetCore.Project - Daniel
因此,为了使用脚手架,我必须创建一些可执行类型项目,然后运行脚手架来创建所有类...并手动复制到我的.net标准类库或做一些技巧,使我可以访问这些文件。 netstandard类库。这是一个黑客。必须有比这更好的方法。我对这篇SO帖子并不感到沮丧,更多的是产品。 - David
@David我目前和你一样处境。我的解决方案是创建一个面向.NET Core的DummyScaffoldingProject,然后将所有生成的类移动到.NET Standard项目。你有没有遇到更好的解决方案?我同意丹尼尔的观点,这是违反直觉的。我想可以写一个滥用DummyScaffoldingProject的PowerShell脚本并自动将生成的文件移动到我的.NET Standard项目中?这将用来自外部的脚本替换VS中的对话框。有什么想法吗? - citronas
这里基本上有两种方式。如果这是一个永远不会在.NET Core之外运行的应用程序层,那么最好的解决方案是以.NET Core而不是.NET Standard为目标。如果由于某种原因需要库以.NET Standard为目标,则可以使用.NET Core目标脚手架项目(使用相同的默认命名空间)然后使用 链接文件夹功能 将使用.NET Core生成的类编译到.NET Standard项目中。 - NightOwl888


这是第一个答案。我其实也想这样做。我得到了Scaffolding但Net Standard似乎没有为表属性加载Extensions。

确保为EF安装EntityFrameworkCore.Tools包。您只需要4.6.1支持,这是默认支持。如果我弄清楚如何修复扩展问题,我会在这里发布。

这两个是必需的。 安装包Microsoft.EntityFrameworkCore.SqlServer 安装包Microsoft.EntityFrameworkCore.Tools


1
2018-05-03 23:20