C# 在.NET标准与.NET核心库中,EF核心是否缺少任何内容?

C# 在.NET标准与.NET核心库中,EF核心是否缺少任何内容?,c#,asp.net-core,.net-core,.net-standard,ef-core-2.0,C#,Asp.net Core,.net Core,.net Standard,Ef Core 2.0,我正在构建一个ASP.NET核心Web API项目。我将大量使用EF Core与SQL Server连接。我想围绕3个主要层组织项目:核心/逻辑/域、数据/基础设施和Web/API Web/API肯定是一个.NET核心项目,但我正在努力决定核心和数据项目应该是.NET核心库还是.NET标准库 我的问题是,在.NET标准库中构建数据持久性时,是否会丢失任何功能或任何东西 从 .NET标准是.NET API的正式规范,旨在在所有.NET实现中提供 从 .NETCore是一个开源的通用开发平台 这对你

我正在构建一个ASP.NET核心Web API项目。我将大量使用EF Core与SQL Server连接。我想围绕3个主要层组织项目:核心/逻辑/域、数据/基础设施和Web/API

Web/API肯定是一个.NET核心项目,但我正在努力决定核心和数据项目应该是.NET核心库还是.NET标准库

我的问题是,在.NET标准库中构建数据持久性时,是否会丢失任何功能或任何东西

.NET标准是.NET API的正式规范,旨在在所有.NET实现中提供

.NETCore是一个开源的通用开发平台

这对你的问题意味着什么

创建.NET标准库时,您可以将该库拉入.NET Core项目或.NET Framework项目,前提是.NET Core/Framework项目将遵循库的相同.NET标准版本或更高版本。因此,.NET标准库将为您提供更大的灵活性,使您能够将该库拉入项目中(如果需要将其拉入运行在.NET Framework>=4.6.1上的旧式应用程序以及将使用.NET Core编写的新应用程序中,这将非常好)


我在使用这种方法时遇到的唯一问题是迁移。如果您想通过
dotnet ef
命令使用EFCore迁移,它希望您以.NET Core版本的项目为目标。因此,如果在.NET标准库中创建
DbContext
,并希望从中创建迁移,则必须为其提供一个作为.NET核心项目的启动项目或实现一个“”。另一方面,最后一个选项确实有一些限制,其中一个限制在上一期中有记录。

对于类库,目标框架只是指定了一个兼容层。最终的功能来自引用类库的项目的目标框架

例如,假设您创建了一个.NET标准库,然后将其包含在.NET Framework项目中。您所做的一切都发生在.NET Framework上,出于所有目的,您也可以从类库中将.NET Framework作为目标。选择.NET标准只是说您将使用一些符合.NET标准的目标的API。这就是全部。因此,EF Core之类的功能最终取决于您将库放入的内容,而不是库的目标框架

至于是选择.NET标准还是.NET核心作为库的目标框架,请简单地说:使用.NET标准,除非您有充分的理由不这样做。如果以.NET标准为目标,则可以将其放入任何以与库目标的.NET标准版本兼容的任何框架为目标的项目中。如果选择.NET Core,则只能在.NET Core项目中使用该库

不过,当你开始关注.NETCore3.0时,事情就变得有点模糊了。从技术上讲,您可以将.NET标准2.1作为目标,并获得.NET Core 3.0的所有优点,但实际上只有.NET Core 3.0支持.NET标准2.1。您可以将.NET标准2.0作为目标,但随后您将不得不使用.NET核心2.2。换句话说,如果您现在想使用.NET Core 3.0,那么选择.NET Standard 2.1或.NET Core 3.0作为库的目标框架在功能上没有什么不同。在任何一种情况下,它都只能在.NET核心3.0项目中工作

更让人困惑的是,微软正在把所有东西的下一个版本都放在.NET5的保护伞下。到那时,.NET标准会变成什么还没有被讨论过,我想它基本上已经消失了。一旦有了.NET5,任何项目都可以以.NET5为目标,并被任何其他以.NET5为目标的项目所使用。不过,这还有很长的路要走。我提出这个问题的原因是,如果你现在想使用.NETCore3.0,那么除了.NETCore3.0之外,没有什么别的目标。NET标准2.1中的大部分内容都无法移植到.NET Framework和Unity之类的东西,因此这些内容永远不会出现在.NET标准2.1中。这些框架的前进方向是使其与.NET Core兼容,最终以.NET Core 4.0结束,微软将其称为.NET 5


长话短说,最好的性能和功能是.NET Core 3.0,只要你能达到100%。NET Core 3.0,那么这就是你应该追求的目标。如果您需要在Xamarin或.NET Framework应用程序中使用库,请坚持使用.NET Standard 2.0。

谢谢,实际上我不会使用迁移。如果唯一的潜在问题是迁移,并且已经有人在四处走动,我将尝试使用.NET标准库。感谢您的帮助,我完全理解了前3段。你能用.NETCore3改写第4段吗?据我所知.NETStandard字面上是一个“接口”,那么你是说标准2.1和更高版本将不再与标准2和更早版本兼容?这句话正确吗:如果我在.NET标准2.0中实现我的逻辑库,我将无法简单地将target升级到.NET Standard 2.1+,因此无法在任何.NET Core 3项目中引用该库?恰恰相反。您可以在.NET Core 3.0中使用.NET标准2.0,但不能在.NET标准2.0中使用3.0内容。既然我们在这里谈论的是EF Core,那就意味着你只能在你的库中使用EF Core 2.2,而不是EF Core 3.0,不管它是否进入.NET Core 3.0项目。明白了,所以最安全的方法是从.NETStandard 2.0开始,用于
Core
Data
库,以及
.NETCore
用于WebApi项目。在这些库中做我需要做的事情。如果一切正常,我将继续使用.NETStandard for libraries,而只升级WebAp