EF Core 是否缺少 .NET Standard 与 .NET Core 库中的任何内容?
Is EF Core missing anything in .NET Standard vs .NET Core library?
我正在构建一个 ASP.NET Core Web API 项目。我将大量使用 EF Core 连接 SQL 服务器。我想围绕 3 个主要层组织项目:Core/Logic/Domain、Data/Infrastructure 和 Web/API.
Web/API 肯定会是一个 .NET Core 项目,但我正在努力决定 Core 和 Data 项目应该是 .NET Core 库还是 .NET Standard 库。
我的问题是,在 .NET Standard 库中构建数据持久性时,我是否会丢失任何功能或任何东西?
来自.NET Standard Microsoft Docs
The .NET Standard is a formal specification of .NET APIs that are intended to be available on all .NET implementations.
.NET Core is an open-source, general-purpose development platform
这对你的问题意味着什么。
创建 .NET Standard 库,假设 .NET Core/Framework 项目遵循相同的 .NET,您将能够将该库拉入 .NET Core 项目或 .NET Framework 项目您的库的标准版本或更高版本。因此,.NET Standard 库将为您提供更大的灵活性,使您能够将该库拉入项目(如果需要将其拉入 .NET Framework >=4.6.1 上的遗留应用程序 运行 则很好以及将在 .NET Core 中编写的新应用程序)。
我在使用这种方法时遇到的唯一问题是关于迁移。如果您想通过 dotnet ef
命令使用 EFCore 迁移,它希望您以 .NET Core 版本为目标项目。因此,如果您在 .NET Standard 库中创建 DbContext
并希望从中创建迁移,则必须为其提供一个作为 .NET Core 项目的启动项目或实现一个 'Design-time DbContext Creation'. As an aside, this last option does have a few limitations, one of which is documented in an issue on GitHub.
对于 class 库,目标框架仅指定一个兼容层。最终功能来自引用 class 库的项目的目标框架。
例如,假设您创建了一个 .NET Standard 库,然后将其包含在 .NET Framework 项目中。您所做的一切都发生在 .NET Framework 上,并且出于所有意图和目的,您也可以从 class 库中以 .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。
我正在构建一个 ASP.NET Core Web API 项目。我将大量使用 EF Core 连接 SQL 服务器。我想围绕 3 个主要层组织项目:Core/Logic/Domain、Data/Infrastructure 和 Web/API.
Web/API 肯定会是一个 .NET Core 项目,但我正在努力决定 Core 和 Data 项目应该是 .NET Core 库还是 .NET Standard 库。
我的问题是,在 .NET Standard 库中构建数据持久性时,我是否会丢失任何功能或任何东西?
来自.NET Standard Microsoft Docs
The .NET Standard is a formal specification of .NET APIs that are intended to be available on all .NET implementations.
.NET Core is an open-source, general-purpose development platform
这对你的问题意味着什么。
创建 .NET Standard 库,假设 .NET Core/Framework 项目遵循相同的 .NET,您将能够将该库拉入 .NET Core 项目或 .NET Framework 项目您的库的标准版本或更高版本。因此,.NET Standard 库将为您提供更大的灵活性,使您能够将该库拉入项目(如果需要将其拉入 .NET Framework >=4.6.1 上的遗留应用程序 运行 则很好以及将在 .NET Core 中编写的新应用程序)。
我在使用这种方法时遇到的唯一问题是关于迁移。如果您想通过 dotnet ef
命令使用 EFCore 迁移,它希望您以 .NET Core 版本为目标项目。因此,如果您在 .NET Standard 库中创建 DbContext
并希望从中创建迁移,则必须为其提供一个作为 .NET Core 项目的启动项目或实现一个 'Design-time DbContext Creation'. As an aside, this last option does have a few limitations, one of which is documented in an issue on GitHub.
对于 class 库,目标框架仅指定一个兼容层。最终功能来自引用 class 库的项目的目标框架。
例如,假设您创建了一个 .NET Standard 库,然后将其包含在 .NET Framework 项目中。您所做的一切都发生在 .NET Framework 上,并且出于所有意图和目的,您也可以从 class 库中以 .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。