Entity Framework Core 1.1 Preview 1 简介

实体框架核心(EF Core)是Entity Framework的一个轻量级,可扩展和跨平台版本。 10月25日,Entity Framework Core 1.1 Preview 1发布了。

升级到Entity Framework Core 1.1 Preview 1

如果您使用由EF团队(SQL Server,SQLite和InMemory)提供的数据库提供程序之一,则只需升级提供程序包。

PM> Update-Package Microsoft.EntityFrameworkCore.SqlServer –Pre
如果您使用的是第三方数据库提供程序,请检查它们是否已发布依赖于1.1.0-preview1-final的更新。 如果他们有,那么只是升级到新版本。 如果没有,那么你应该只能升级它们依赖的EF Core关系组件。 1.1中的大部分新功能不需要更改数据库提供程序。 EF开发组做了一些测试,以确保依赖于1.0的数据库提供程序继续使用1.1预览1,但这个测试还不详尽。
 
PM> Update-Package Microsoft.EntityFrameworkCore.Relational –Pre

升级tooling packages

如果你使用的工具包,那么一定要升级。 请注意,工具版本化为1.0.0-preview3-final,因为工具尚未达到其初始稳定版本(在.NET Core,ASP.NET Core和EF Core上的工具都是如此)。

PM> Update-Package Microsoft.EntityFrameworkCore.Tools –Pre
如果您使用的是ASP.NET Core,那么您需要更新project.json的tools部分以使用新的Microsoft.EntityFrameworkCore.Tools.DotNet包。 随着.NET CLI工具的设计的进行,我们必须将dotnet ef工具分离到这个单独的包中。
"tools": {
  "Microsoft.EntityFrameworkCore.Tools.DotNet": "1.0.0-preview3-final"
},

什么是Entity Framework Core 1.1 Preview 1

1.1版本专注于解决阻止人们采用EF Core的问题。 这包括修复错误并添加一些尚未在EF Core中实现的关键功能。 虽然EF开发组在这方面取得了一些良好的进展,但是,EF Core仍然不会是每个人的正确选择。 有关实现的更多详细信息,请参阅下面的EF Core和EF6.x比较。

EF Core和EF6.x比较

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

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继续是一个受支持的产品,并将继续进行错误修复和小的改进。

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查询中的备用密钥和混合客户端/数据库评估)。

改进LINQ翻译

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

DbSet.Find

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

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

映射到字段(Mapping to fields)

API中的新的HasField(...)方法允许您为属性配置备用字段。 这是最常见的做法是当一个属性没有setter。

public class BloggingContext : DbContext
{
    ...

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property(b => b.Url)
            .HasField("_theUrl");
    }
}
默认情况下,EF将在查询期间构造实体的实例时使用该字段,或者当它无法使用该属性时(即,它需要设置值,但没有属性设置器)。 您可以通过新的UsePropertyAccessMode(...)API更改。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Url)
        .HasField("_theUrl")
        .UsePropertyAccessMode(PropertyAccessMode.Field);
}

您还可以在模型中创建在实体类中没有相应属性的属性,但使用字段将数据存储在实体中。 这与“阴影属性”(下面介绍,距离此处12cm)不同,数据存储在更改跟踪器中。 如果实体类使用方法来获取/设置值,则通常使用此方法。

您可以在属性(...)API中给EF字段的名称。 如果没有具有给定名称的属性,则EF将寻找一个字段。

public class BloggingContext : DbContext
{
    ...

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property("_theUrl");
    }
}
您还可以选择为该属性指定名称,而不是字段名称。 然后在创建模型时使用此名称,最明显的是它将用于映射到数据库中的列名称。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property<string>("Url")
        .HasField("_theUrl");
}
您可以使用EF.Property(...)方法在LINQ查询中引用这些属性。
var blogs = db.Blogs
    .OrderBy(b => EF.Property<string>(b, "Url"))
    .ToList();
 

阴影属性(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"));

阴影属性约定(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; }
}

阴影属性数据注释

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

阴影属性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; }
}

阴影属性介绍完毕!

 

显式加载

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

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();
}

来自EF6.x的其他EntityEntry API

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

连接弹性

连接弹性自动重试失败的数据库命令。 此版本包括专为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(...));
}

 

SQL Server内存优化表支持

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

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .ForSqlServerIsMemoryOptimized();
 }
 

简化服务更换

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

public class BloggingContext : DbContext
{
    ...

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        ...

        optionsBuilder.ReplaceService<SqlServerTypeMapper, MyCustomSqlServerTypeMapper>();
    }
}

Entity Framework Core 1.1 Preview 1的未来版本

稳定的1.1版本将于今年晚些时候推出。 EF研发团队不计划在preview1和稳定版本之间添加任何新功能。 将只是努力修复报告的错误。

EF研发团队现在将注意力转移到EF Core 1.2和EF6.2版本。 将在不久的将来分享这些版本的详细信息。

 

贴一张Rowan Miller的帅照。Microsoft员工,EF研发团队成员,他的个人Blog:https://romiller.com/,有兴趣的朋友可以去看看。

9k=

最后,希望本文对你有所帮助。

转载请注明出处,转载请注明出处,转载请注明出处,重要的事情说三遍:http://www.cnblogs.com/smallprogram/

posted @ 2016-11-15 15:22  SmallProgram  阅读(1560)  评论(5编辑  收藏  举报