【问题标题】:Is EF Core missing anything in .NET Standard vs .NET Core library?EF Core 是否缺少 .NET Standard 与 .NET Core 库中的任何内容?
【发布时间】:2019-09-11 16:55:39
【问题描述】:

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

Web/API 肯定会是一个 .NET Core 项目,但我正在努力决定 Core 和 Data 项目应该是 .NET Core 库还是 .NET Standard 库。

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

【问题讨论】:

    标签: c# asp.net-core .net-core .net-standard ef-core-2.0


    【解决方案1】:

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

    例如,假设您创建了一个 .NET Standard 库,然后将其包含在一个 .NET Framework 项目中。您所做的一切都发生在 .NET Framework 上,并且出于所有意图和目的,您也可以从类库中以 .NET Framework 为目标。选择 .NET Standard 只是表示您将使用来自某些符合 .NET Standard 的目标的 API。就这样。因此,像 EF Core 这样的东西的功能最终取决于您将库放入的内容,而不是您的库的目标框架。

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

    不过,当您开始研究 .NET Core 3.0 时,情况会变得有些模糊。您可以在技术上以 .NET Standard 2.1 为目标并获得 .NET Core 3.0 的所有优点,但除了 .NET Core 3.0 之外,没有任何东西实际上支持 .NET Standard 2.1。您可以以 .NET Standard 2.0 为目标,但随后您就被 .NET Core 2.2 困住了。换句话说,如果你想使用 .NET Core 3.0,现在选择 .NET Standard 2.1 或 .NET Core 3.0 作为库的目标框架在功能上没有区别。无论哪种情况,它都只适用于 .NET Core 3.0 项目。

    更令人困惑的是,Microsoft 正在将下一个版本的所有内容都转移到 .NET 5 的保护伞下。那时 .NET Standard 会变成什么样子还没有被讨论过,我想它在很大程度上会消失。一旦有了 .NET 5,任何项目都可以以 .NET 5 为目标,并被任何其他以 .NET 5 为目标的项目使用。不过,这还有很长的路要走。我提出这个问题的原因是,如果你现在想使用 .NET Core 3.0,那么除了 .NET Core 3.0 之外没有什么意义。 .NET Standard 2.1 中的大部分内容都不能向后移植到 .NET Framework 和 Unity 之类的东西上,因此它们永远不会出现在 .NET Standard 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。

    【讨论】:

    • 完全理解前3段。你能用 .NETCore3 改写第 4 段吗?据我了解,.NETStandard 字面意思是“一个接口”,所以您是说 Standard 2.1 及更高版本不会与 Standard 2 及之前的版本向后兼容?
    • 这句话是否正确:如果我在 .NET Standard 2.0 中实现我的逻辑库,我将无法简单地将目标升级到 .NET Standard 2.1+,因此将无法引用该库在任何 .NET Core 3 项目中。 ?
    • 恰恰相反。您可以在 .NET Core 3.0 中使用 .NET Standard 2.0,但不能在 .NET Standard 2.0 中使用 3.0 的东西。由于我们在这里讨论的是 EF Core,这意味着您只能在库中使用 EF Core 2.2,而不是 EF Core 3.0,无论它是否进入 .NET Core 3.0 项目。
    • 知道了,所以最安全的方法是从 .NETStandard 2.0 开始 CoreData 库和 .NETCore 对于 WebApi 项目。在这些库中做我需要做的事情。如果一切正常,我将继续使用 .NETStandard 作为库,同时仅将 WebApi 项目升级到 .NETCore3 和更多未来版本。当我达到 .NETCore WebApi 需要更高的 .NETStandard 时,我将升级我的库。换句话说,我要保持库低,而 webapi 项目 - 高。我希望我能清楚地表达自己
    • 明白了,从技术上讲,.NET Framework 和 .NET Core 应用程序可以使用的最高级库目标是 .NET Standard 2.0。你可以说“最后一个真正的 .net 标准”:)) 谢谢 Chris,你帮了我很多
    【解决方案2】:

    来自.NET Standard Microsoft Docs

    .NET 标准是 .NET API 的正式规范,旨在用于所有 .NET 实现。

    来自.NET Core Microsoft Docs

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

    这对您的问题意味着什么。

    创建 .NET Standard 库后,您可以将该库拉入 .NET Core 项目或 .NET Framework 项目,前提是 .NET Core/Framework 项目将遵循与您相同的 .NET Standard 版本图书馆或更大。因此,.NET Standard 库将为您提供更多的灵活性,让您能够将库拉入的项目(如果需要将其拉入在 .NET Framework >=4.6.1 上运行的旧应用程序以及新应用程序中,那就太好了)将使用 .NET Core 编写)。

    我在使用这种方法时遇到的唯一问题是关于迁移。如果您想通过 dotnet ef 命令使用 EFCore 迁移,它希望您以具有 .NET Core 版本的项目为目标。因此,如果您在 .NET Standard 库中创建 DbContext 并希望从中创建迁移,则必须为其提供一个 .NET Core 项目的启动项目或实现“Design-time DbContext Creation”。顺便说一句,最后一个选项确实有一些限制,其中一个记录在GitHub 上的问题中。

    【讨论】:

    • 谢谢,我实际上不会使用迁移。如果唯一的潜在问题是迁移,并且已经有一个解决方案,我将尝试 .NET Standard 库。感谢您的帮助
    猜你喜欢
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2017-02-12
    • 2017-08-05
    相关资源
    最近更新 更多