Entity Framework Core 1.1 Preview 1 简要介绍

详细信息:

IT之家1月2日消息在微软Connect(); 2018大会上,微软宣布推出.NET Core
3预览版,使用Visual Studio 2019预览版、Visual Studio for Mac以及Visual
Studio Code均可开发.NET Core 3应用程序。.NET Core
3的面世,是一次重大更新。

显式加载

显式加载允许您加载由上下文跟踪的实体的导航属性的内容。

using (var db = new BloggingContext())
{
    var blog = db.Blogs.Find(1);

db.Entry(blog).Collection(b => b.Posts).Load();
db.Entry(blog).Reference(b => b.Author).Load();
}

(文/开源中国)    

本地dotnet工具

来自EF6.x的其他EntityEntry API

EF研发团队添加了EF6.x中提供的其余EntityEntry API。
这包括Reload(),GetModifiedProperties(),GetDatabaseValues()等。这些API最常用的是通过调用DbContext.Entry(对象实体)方法。

可以将新版本的 dotnet ef 与使用 EF Core
运行时的较旧版本的项目一起使用。但是,该工具的较旧版本不适用于 EF Core
3.1。

调用本地工具时,dotnet会在目录结构中搜索清单。当找到工具清单文件后,就在其中搜索所请求的工具。如果找到了该工具,它将包含在NuGet全局包位置中查找该工具所需要的信息。

EF Core和EF6.x比较

有两个版本的Entity Framework,Entity Framework Core和Entity Framework
6.x.

dotnet tool install --global dotnet-ef --version 3.1.0

可以在以下示例中看到新体验:

阴影属性(Entity Framework Core)

阴影属性是实体类中不存在的属性。
这些属性的值和状态完全保留在更改跟踪器中

可以通过ChangeTracker API获取和更改阴影属性值。

context.Entry(myBlog).Property("LastUpdated").CurrentValue = DateTime.Now;
阴影属性可以通过EF.Property静态方法在LINQ查询中引用。
var blogs = context.Blogs
    .OrderBy(b => EF.Property<DateTime>(b, "LastUpdated"));

EF 6.4的新增功能

还有一些操作,例如linking和razor page publishing,仍然需要发布。

阴影属性数据注释

无法使用数据注释创建阴影属性。

目前,Entity Framework Core
3.1 和 Entity
Framework
6.4 已正式发布。

dotnet
build现在可以在构建操作期间把应用的NuGet依赖项从NuGet缓存中复制到构建输出文件夹中。在此版本之前,这些依赖项仅作为dotnet
publish的一部分进行复制。此更改能够通过xcopy命令将构建输出复制到不同的计算机中。

Entity Framework 6.x

Entity Framework
6.x(EF6.x)是一种经过试验和测试的数据访问技术,具有多年的功能和稳定性。
它首次在2008年发布,作为.NET Framework 3.5 SP1和Visual Studio 2008
SP1的一部分。 从EF4.1版本开始,它作为EntityFramework NuGet包发运 –
目前是NuGet.org上最受欢迎的包。

EF6.x继续是一个受支持的产品,并将继续进行错误修复和小的改进。

EF Core 3.1的获取方式

如果将工具清单文件签入到您的源代码控制中,则克隆您的存储库的程序员可以如上所述访问正确的工具。

改进LINQ翻译

在1.1版本中,EF研发团队在改进EF Core LINQ提供程序方面取得了良好的进展。
这使得更多的查询能够成功执行,在数据库(而不是内存)中评估更多的逻辑。

将面向较早版本的 ASP.NET Core 的应用程序升级到 3.1 时,您可能还必须添加
EF Core 程序包作为显式依赖项。

同时还可以在Visual Studio 2019预览版1中打开、启动和调试WPF和Windows
Forms项目。

阴影属性Fluent API

您可以使用Fluent API配置阴影属性。
一旦你调用了Property的字符串重载,你就可以链接任何对其他属性的配置调用。

如果提供给Property方法的名称与现有属性(阴影属性或实体类上定义的属性)的名称匹配,则代码将配置现有属性,而不是引入新的shadow属性。

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property<DateTime>("LastUpdated");
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

阴影属性介绍完毕!

 

EF Core 3.1 作为一组 NuGet 软件包专门分发。例如,要将 SQL Server
提供程序添加到您的项目中,可以使用 dotnet 工具使用以下命令:

.NET Core应用现在使用可执行文件进行构建。对于使用全局安装的.NET
Core版本的应用而言,这是一项新功能。到目前为止,只有自包含的应用具有可执行文件。对于这些可执行文件,开发者可以期待它们与其他本地可执行文件具有相同的特性,例如:

连接弹性

连接弹性自动重试失败的数据库命令。 此版本包括专为SQL Server(包括SQL
Azure)定制的执行策略。 此执行策略包含在我们的SQL Server提供程序中。
它知道可以重试的异常类型,并且具有明显的默认值,用于最大重试次数,重试之间的延迟等。

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseSqlServer(
        "<connection string>",
        options => options.EnableRetryOnFailure());
}

其他数据库提供者可以选择添加为其数据库定制的重试策略。
还有一种机制来注册自己的自定义执行策略。

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseMyProvider(
        "<connection string>",
        options => options.ExecutionStrategy(...));
}

 

dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 3.1.0
dotnettoolrun

Entity Framework Core

实体框架核心(EF Core)是Entity
Framework的一个轻量级,可扩展和跨平台版本。 与EF6.x相比,EF
Core引入了许多改进和新功能。 同时,EF Core 是一个新的代码基础

EF Core保留了来自EF6.x的开发者体验,大多数顶级API也保持不变,因此EF
Core对使用EF6.x的用户会感到非常熟悉。 同时,EF
Core构建了一套全新的核心组件。 这意味着EF
Core不会自动继承EF6.x的所有功能。
其中一些功能将在未来版本中显示(例如延迟加载和连接弹性),其他较不常用的功能将不会在EF
Core中实现。

新的,可扩展的和轻量级核心还允许我们在EF核心中添加一些在EF6.x中不能实现的特性(例如在LINQ查询中的备用密钥和混合客户端/数据库评估)。

从 3.0 开始到 3.1 继续,.NET Core SDK 中不再包含 dotnet ef
命令行工具。在执行 EF Core
迁移或脚手架命令之前,您必须将此软件包作为全局或本地工具安装。要将 3.1.0
工具的最终版本安装为全局工具,请使用以下命令:

dotnet build现在可以复制依赖项

DbSet.Find

DbSet.Find(…)是一个存在于EF6.x中的API,并且是EF
Core的更常见的请求之一。 它允许您根据主键值轻松查询实体。
如果实体已经加载到上下文中,则返回它而不查询数据库。

using (var db = new BloggingContext())
{
    var blog = db.Blogs.Find(1);
}
  • 据悉,EF Core 3.1 的主要目标是完善在 EF Core 3.0
    中提供的功能和方案。EF Core 3.1
    将是一个长期支持(LTS)版本,至少支持 3 年。EF Core 3.1 重新引入了对
    .NET Standard 2.0 的支持,而不是像 EF Core 3.0 那样要求 .NET
    Standard 2.1 。这意味着 EF Core 3.1 将在支持该标准的 .NET Framework
    版本上运行。
  • 此外,该版本还修复了 150
    多个问题,但没有要宣布的主要新功能。

WPF和Windows Forms现在可以与.NET
Core一起使用。它们出现在一个名为“Windows桌面”的新组件中,该组件是Windows版本的SDK的一部分。

简化服务更换

在EF Core
1.0中,可以替换EF使用的内部服务,但这是复杂的,需要您控制EF使用的依赖注入容器。
在1.1中,我们使用了一个ReplaceService(…)方法,可以在配置上下文时使用它。

public class BloggingContext : DbContext
{
    ...

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{


optionsBuilder.ReplaceService();
}
}

EF Core 3.1的新增功能

应用现在默认具有可执行文件

SQL Server内存优化表支持

内存优化表是SQL Server的一项功能。
您现在可以指定实体映射到的表是内存优化的。 当使用EF
Core基于您的模型(使用迁移或Database.EnsureCreated)创建和维护数据库时,将为这些实体创建一个内存优化表。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .ForSqlServerIsMemoryOptimized();
 }
 
  • 与 EF Core 类似,EF 6.4 的主要目标是完善在 EF 6.3
    中提供的功能和方案。为此,该团队修复了 EF 6.3
    中发现的重要问题,以创建更稳定的发行版。

开源的WPF、Windows Forms和WinUI

阴影属性约定(Conventions Shadow Properties)

按照惯例,仅当发现关系时才创建阴影属性,但在从属实体类中找不到外键属性。
在这种情况下,将引入影子外键属性。
shadow外键属性将命名为<navigation property name><principal
key property
name>
(在依赖实体上的导航,它指向主体实体,用于命名)。
如果主键属性名称包含导航属性的名称,则名称将只是<principal key
property name>

如果从属实体上没有导航属性,则在其位置使用主类型名称。

例如,以下代码清单将导致向Post实体引入BlogId shadow属性。

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public Blog Blog { get; set; }
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注