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)提供的数据库提供程序之一,则只需升级提供程序包。json

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上的工具都是如此)。app

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.ide

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中实现。ui

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

改进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/

相关文章
相关标签/搜索