Entity Framework Core 3.0 和 Entity Framework 6.3 正式发布

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/ 

猜你喜欢

转载自www.oschina.net/news/110116/entity-framework-core-3-0-and-entity-framework-6-3-released