Entity Framework Core 3.0 和 Entity Framework 6.3 通用版发布了,接下来我们看看它的新内容:
Entity Framework Core 3.0
EF Core 3.0 包括主要特性、小部分增强和错误修复,以下是一些重要内容:
LINQ overhaul
重构了 LINQ Provider,以便能够将更多的查询模式转换为 SQL,在更多情况下生成高效的查询,并防止低效率的查询无法被检测到。新的 LINQ Provider 是能在未来版本中提供新的查询功能和性能改进的基础,而不会破坏现有的应用程序和数据提供程序。
Cosmos DB 支持
EF Core 的 Cosmos DB Provider 让熟悉 EF 编程模型的开发人员能够轻松地将 Azure Cosmos DB 作为应用程序数据库。其目标是使 Cosmos DB 的一些优点,如全球分布(Global distribution)、“always on”可用性、弹性可伸缩性和低延迟,被 .NET 开发人员更容易访问。Cosmos DB Provider 针对 Cosmos DB 中的 SQL API 启用了大多数 EF Core 功能,如自动更改跟踪、LINQ 和值转换。
C# 8.0 支持
EF Core 3.0 利用了 C# 8.0 中的一些新特性:
- 异步流:异步查询结果现在使用新标准 IAsyncEnDigable<T> 接口公开,并且可以使用 await foreach
- 可空引用类型:在代码中启用此新功能时,EF Core 检查引用类型属性的空值性,并将其应用于数据库中相应的列和关系
拦截数据库操作
EF Core 3.0 中的包含新的 API,用于拦截数据库操作。这与 EF 6 中存在的截取功能非常相似,它允许编写简单的逻辑,只要打开数据库连接、提交事务或执行查询,EFCore 就会自动调用该逻辑。拦截器通常允许在操作发生之前或之后拦截它们。当在它们发生之前拦截它们时,可以旁路执行并提供截取逻辑的备用结果。
例如,要操作命令文本,可以创建一个 IDbCommandInterceptor:
public class HintCommandInterceptor : DbCommandInterceptor
{
public override InterceptionResult ReaderExecuting(
DbCommand command,
CommandEventData eventData,
InterceptionResult result)
{
// Manipulate the command text, etc. here...
command.CommandText += " OPTION (OPTIMIZE FOR UNKNOWN)";
return result;
}
}
并将其注册到你的 DbContext 中:
services.AddDbContext(b => b
.UseSqlServer(connectionString)
.AddInterceptors(new HintCommandInterceptor()));
数据库视图的逆向工程
Query Types(表示可以从数据库读取但未更新的数据),现在重命名为 keyless entity types。由于 EF Core 非常适合在大多数场景中映射数据库视图,所以现可在反向工程数据库视图时自动创建 keyless entity types。
例如,使用 DotNet EF 命令行工具(dotnet ef command-line tool),键入:
dotnet ef dbcontext scaffold "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer
该工具将自动为没有键的视图和表,提供 scaffold types:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Names>(entity =>
{
entity.HasNoKey();
entity.ToView("Names");
});
modelBuilder.Entity<Things>(entity =>
{
entity.HasNoKey();
});
}
与主体共享表的依赖实体是可选的
从 EF Core 3.0 开始,如果 OrderDetails 属于 Order 或显式映射到同一个表,则可以在没有 OrderDetails 和所有 OrderDetails 属性的情况下添加 Order,但主键将映射到可空列。
当查询时,如果它必要属性不存在值,或者它除了主键之外没有必要属性,EF Core 会将 OrderDetails 设置为 null。
public class Order
{
public int Id { get; set; }
public int CustomerId { get; set; }
public OrderDetails Details { get; set; }
}
[Owned]
public class OrderDetails
{
public int Id { get; set; }
public string ShippingAddress { get; set; }
}
Entity Framework 6.3
最新版本的 EF 6 移植到 .NET Core 3.0 上,以下是一些最显著的改进:
- 支持 .NET Core 3.0
- 除了 .NET Framework 4.0 和 4.5 之外,EF 6.3 runtime 包现支持 .NET Standard 2.1
- 迁移命令已被重写,以执行进程外和使用 SDK 样式的项目
- 对 SQL Server 层次结构的支持
- 改进与 Roslyn 和 NuGet PackageReference 的兼容性
- 添加了 ef6.exe 实用程序,取代了 portate.exe,用于启用、添加、编写脚本和应用来自程序集的迁移
在 .NET Core 中使用 EF 6.3 有一定的限制。例如:
- 数据提供程序也需要移植到 .NET Core。然而只移植了包含在 EF 6.3 包中的 SQL Server 提供程序
- spatial 支持不会在 SQL Server 中启用,因为 spatial 类型无法使用 .NET Core
- 目前不支持在 .NET Core 或 .NET Standard 项目上直接使用 EF designer
详情见发布说明:
https://devblogs.microsoft.com/dotnet/announcing-ef-core-3-0-and-ef-6-3-general-availability/
转自 https://www.oschina.net/news/110116/entity-framework-core-3-0-and-entity-framework-6-3-released