Entity Framework Core 3.0 和 Entity Framework 6.3 通用版发布了,接下来我们看看它的新内容:
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 中的一些新特性:
拦截数据库操作
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(entity =>
{
entity.HasNoKey();
entity.ToView("Names");
});
modelBuilder.Entity(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; }
}
最新版本的 EF 6 移植到 .NET Core 3.0 上,以下是一些最显著的改进:
在 .NET Core 中使用 EF 6.3 有一定的限制。例如:
详情见发布说明:
https://devblogs.microsoft.com/dotnet/announcing-ef-core-3-0-and-ef-6-3-general-availability/