今天,.NET数据团队宣布了EF Core 7.0(EF7)的第四个预览版。 除了错误修复和较大功能的基础工作外,这个预览版还包括更新,以确保转换器和比较器由类型映射处理,并支持使用转换器与值生成器。请务必阅读EF7的完整计划,了解路线图上的内容。
领域驱动设计和 "保护性 "键
领域驱动设计(DDD)的一个模式是使用值对象作为键的概念。换句话说,不要像这样声明一个键:
public class Thing
{
public int Id { get; set; }
}
相反,它可能看起来像这样。
public class Thing
{
public ThingKey Id { get; set; }
}
public class ThingKey
{
public ThingKey(Func<int> generator) => Id = generator();
public ThingKey(int id) => Id = id;
public int Id { get; private set; }
}
这样做有几个好处。首先,也许是最明显的是,它隐藏了键的实现细节。如果你决定要消耗GUID的无限资源,而不是更有限的、无聊的、有顺序的可用整数,由于key类提供的缓冲区,你的重构会更容易。 你还可以通过验证来保护key不受坏数据的影响,这样就不会有人意外地分配一个负值。说到意外,你是否曾把错误的id传给一个接受key的方法?编译器并不在意,因为它都是ints......或字节......或1和0......但如果你使用强类型的键,你将被迫提供适合的键,咳,"老爹式笑话 " 。否则,编译器会抱怨。
当然,你是否使用这种方法取决于你,但在预览版4之前,EF Core中的选择是有限的。从实体转换到标量的最明显的方法是使用转换器,但是如果你试图将一个转换器分配给一个标记为值生成的属性,EF Core会抛出一个异常。这个限制已经被取消了,更重要的是,代码已经更新,以确保这种情况得到正确处理。感谢81位为这个问题投票的人,它被列为优先事项,现在可以供你试用了。如果你正在使用这个功能,请告诉我们,它对你的效果如何
前提条件
- EF7目前的目标是.NET 6。当我们接近发布时,这可能会被更新为.NET 7。
- EF7将不会在.NET框架上运行。
EF7是EF Core 6.0的后续版本,不能与EF6混淆。如果你正在考虑从EF6升级,请阅读我们的指南,从EF6移植到EF Core。
如何获得EF7预览版
EF7完全以一套NuGet包的形式发布。 例如,要在你的项目中添加SQL Server提供者,你可以使用dotnet工具使用以下命令:
dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 7.0.0-preview.4.22229.2
下面的表格链接到EF Core包的预览1版本,并描述了它们的用途:
| 包 | 用途 |
|---|---|
| Microsoft.EntityFrameworkCore | 独立于特定数据库提供者的主要EF Core包。 |
| Microsoft.EntityFrameworkCore.SqlServer | Microsoft SQL Server和SQL Azure的数据库提供商。 |
| Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite | SQL Server对空间类型的支持 |
| Microsoft.EntityFrameworkCore.Sqlite | SQLite的数据库提供者,包括数据库引擎的本地二进制文件 |
| Microsoft.EntityFrameworkCore.Sqlite.Core | 用于SQLite的数据库提供者,没有打包的本地二进制文件 |
| Microsoft.EntityFrameworkCore.Sqlite.NetTopologySuite | SQLite对空间类型的支持 |
| 微软.EntityFrameworkCore.Cosmos | 用于Azure Cosmos DB的数据库提供商 |
| Microsoft.EntityFrameworkCore.InMemory | 内存数据库提供者 |
| 微软.EntityFrameworkCore.Tools | 用于Visual Studio Package Manager Console的EF Core PowerShell命令;使用它可以将脚手架和迁移等工具与Visual Studio集成起来。 |
| Microsoft.EntityFrameworkCore.Design | 用于EF Core工具的共享设计时组件 |
| Microsoft.EntityFrameworkCore.Proxies | 懒惰的加载和变化跟踪的代理 |
| Microsoft.EntityFrameworkCore.Abstractions | 解耦的EF Core抽象;使用它来实现EF Core定义的扩展数据注释等功能。 |
| Microsoft.EntityFrameworkCore.Relational | 用于关系型数据库提供者的共享的EF Core组件 |
| Microsoft.EntityFrameworkCore.Analyzers | 用于EF Core的C#分析器 |
我们还发布了用于ADO.NET的Microsoft.Data.Sqlite.Core提供者的7.0预览版1版。
安装EF7命令行界面(CLI)
在你执行EF7 Core迁移或脚手架命令之前,你必须将CLI包安装为全局或本地工具。
要全局安装预览工具,请安装:
dotnet tool install --global dotnet-ef --version 7.0.0-preview.4.22229.2
如果你已经安装了该工具,你可以用下面的命令来升级它:
dotnet tool update --global dotnet-ef --version 7.0.0-preview.4.22229.2
在使用旧版本的EF Core运行时的项目中使用这个新版本的EF7 CLI是可能的。
日常构建
EF7预览版与.NET 7预览版是一致的。这些预览版往往滞后于EF7的最新工作。考虑使用日常构建来获得最新的EF7功能和错误修复。
与预览版一样,日常构建需要.NET 6。
.NET数据社区的准备工作
.NET数据团队现在每隔周三在太平洋时间上午10点,东部时间下午1点,或UTC时间17点进行直播。加入流媒体,就您选择的数据相关主题提出问题,包括最新的预览版。
- 观看我们在YouTube上的节目播放列表
- 访问.NET社区Standup页面,预览即将到来的节目
- 提交您对嘉宾、产品、演示或其他内容的想法。
文档和反馈
所有EF Core文档的起点是docs.microsoft.com/ef/。
请在dotnet/efcore GitHub repo上提交发现的问题和任何其他反馈。
有用的链接
以下链接是为方便参考和访问而提供的。
- EF Core社区Standup播放列表: https://aka.ms/efstandups
- 主要文档:https://aka.ms/efdocs
- EF Core的问题和功能请求: https://aka.ms/efcorefeedback
- 实体框架路线图: https://aka.ms/efroadmap
- 双周更新: https://github.com/dotnet/efcore/issues/27185
来自团队的感谢
EF团队对多年来使用EF并为之做出贡献的所有人表示衷心的感谢!