Entity Framework Core

Entity Framework Core 1.1 Preview 1发布

Entity Framework Core (EF Core) 是一个轻量级的,可扩展,的跨平台Entity Framework. 今天已经发布 Entity Framework Core 1.1 Preview 1 。

Entity Framework Core

更新1.1 Preview 1

如果你使用数据库 providers 是SQL Server, SQLite, and InMemory,那你就需要升级 provider 包。

[highlight color="yellow"]PM> Update-Package Microsoft.EntityFrameworkCore.Relational -Pre[/highlight]

如果你是使用第三方的数据库provider,你需要检测发布更新中是否有支持1.1.0-preview 1.如果支持你可以更新最新版本,否则
就需要更新EF Core相关组建,当然1.1版本的新功能并不会影响数据库provider。我们已经做过测试1.0和1.1的数据库provider是完全兼容,但并不是100%的工具都测试过。
[highlight color="yellow"]
PM> Update-Package Microsoft.EntityFrameworkCore.Relational -Pre
[/highlight]


更新工具包

 

如果使用工具包,也需要更新,注意工具包的版本是1.0.0-preview3-final,因为工具已经工具包访问.NET Core, ASP.NET Core, 和EF Core之间需要兼容,而现在并不是很稳定。

[highlight color="yellow"]
PM> Update-Package Microsoft.EntityFrameworkCore.Tools -Pre

[/highlight]

如果你使用 ASP.NET Core, 你需要工具包的Microsoft.EntityFrameworkCore.Tools.DotNet. 因为是相关.NET CLI Tools 编译进程,
而且会将他分离到dotnet ef 工具中.

 

[highlight color="yellow"]
"tools": {
  "Microsoft.EntityFrameworkCore.Tools.DotNet": "1.0.0-preview3-final"
},
[/highlight]

What’s in 1.1 Preview 1

1.1 release 已经发布 EF Core. 包括修复bug和添加一些新功能,此版本主要EF Core提供大家选择,还有好的建议的纳入.更多详细信息可以阅读如下:EF Core and EF6.x comparison.

Improved LINQ translation

这一版本中我们非常好的改进 EF Core LINQ provider. 授权更多高效查询,更好执行在更多类型的数据库(in memory).

DbSet.Find

 

DbSet.Find(…) 是一个 API 已经能在EF Core中使用.允许你更容易的基于主建值查询数据.如果数据已经加载到context中,将不能将查询语句执行数据中.

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

Mapping to fields

最新的HasField(…) 这个方法将成熟的API,允许你配置返回一个域的属性,最后可以查看这个属性是否设置值.

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

您还能创建一个属性在你的模型里面,不需要直接和实体分类进行关联,但使用一个域保存数据在实体里面,这里所定于的属性应该是弱类型属性,数据就会自动改变跟踪。这里特别的是代码必须使用 get/set 值设置值.

你能给 EF 的属性 API命名. 如果没有名字, 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");
}

You can use the EF.Property(…) method to refer to these properties in a LINQ query.

var blogs = db.Blogs
    .OrderBy(b => EF.Property<string>(b, "Url"))
    .ToList();

明确加载

明确加载允许你加载内容用于每一个Context时都明确调用Load方法

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中的APIs

我们额外推荐源于EF6.x 中的EntityEntry APIs ,包括 Reload(), GetModifiedProperties(), GetDatabaseValues() 等. 这些 APIs 是共同访问 DbContext.Entry(object entity) 方法。

联系的弹性

自动连接的能力能更好的找回数据库连接失败的命令,.发布执行策略,SQL Server (including SQL Azure). 这里执行策略包括 SQL Server provider. 捕获异常类型能够获得链接失败次数和链接失败信息和设置。

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

对于其他数据的 providers选择其他的数据库和其他跟踪 策略. 也能自定义自己的异常策略。

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

基于表级别的SQL Server memory-optimized

Memory-Optimized Tables  SQL Server的新功能. 你现在详细的表影射实体时候获得更好的内存优化. 当EF Core 正在使用创建一个基于数据库的模型时, (migrations or Database.EnsureCreated), a memory-optimized table 优化这些实体数据。.

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

简化服务替换

In EF Core 1.0 可能需要替换内部服务,但这是非常复杂. 在1.1 我们很简单,用于ReplaceService(…) 就可以配置context.

public class BloggingContext : DbContext
{
    ...

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

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

1.1 Preview 1 之后还有什么

发布1.1正式版将会在年末发布,我们没有计划发布更多新功能,我们集中于修复bugs而工作,整个团队努力玉 EF Core 1.2 和 EF6.2 releases.

 

.NET

微软将停止支持.NET Framework 4.0、4.5和4.5.1

微软将于2016年1月12日正式停止支持.NET Framework的4.0、4.5和4.5.1版本。用户应该升级到更近的版本,比如稍微有点不兼容的.NET 4.5.2。

.net

在我们继续后面的内容之前,有一点应该注意一下,就是这只影响4.x版本系列。对于更老的.NET 3.5 SP1版本,微软还会继续支持。在这里,支持是指用户可以获得技术支持、安全更新和补丁。

兼容性

在升级到.NET 4.5.2时,ASP.NET开发人员可能会遇到兼容性问题。虽然被认为是一个安全风险,但开发人员先前可以通过在应用程序或页面层面将enableViewStateMac置为false来禁用视图状态消息认证码。现在不允许这样做了。

如果要将应用重新编译成.NET 4.5.2应用程序,并使用DataObject.GetData读取剪切板,那么也会遇到问题:

对于面向.NET Framework 4的应用或者运行在.NET Framework 4.5.1及更早版本上的应用,DataObject.GetData会将获取到的HTML格式的数据表示成ASCII字符串。因此,非ASCII字符 (那些ASCII码大于0x7F的字符)会表示成两个随机字符。例如,é (0xE9)会表示成é (0xC3 0xA9)。

对于面向.NET Framework 4.5或更高版本的应用或者运行在.NET Framework 4.5.2上的应用,DataObject.GetData会将获取到的HTML格式的数据表示成UTF-8,可以正确地表示大于0x7F的字符。

如果选择迁移到.NET 4.6,那么破坏性变更就更明显了。详情见.NET Framework 4.6应用程序兼容性

Azure

如果你开启了自动升级,那么Windows Azure Guest OS将在1月份升级到.NET 4.5.2。

Entity Framework 6的重大变革

Entity Framework首次发布的时候是作为.NET Framework核心库的一部分。但微软随即意识到EF并不是一个完整的产品,需要用一些“带外的(out-of-band)”发布来进行增强。这使其被划分为两大类别:System.Data.Entity.dll中的核心类和EntityFramework.dll中的带外类。

从那以后,微软决定将Entity Framework整个迁移到开源模型。这需要进一步改造,而且其核心文件也不可能简单地从.NET 4.0中移除。为了解决这一问题,微软使用了命名空间切换。“命名空间切换的一般规则是,将System.Data.*下的类型迁移到System.Data.Entity.Core.*”。

一些例外情况包括:

  • System.Data.EntityState => System.Data.Entity.EntityState
  • System.Data.Objects.DataClasses.EdmFunctionAttribute => System.Data.Entity.DbFunctionAttribute(注意类的名称也发生了变化,旧类依然存在并且可以工作,但被标注为废弃的。)
  • System.Data.Objects.EntityFunctions => System.Data.Entity.DbFunctions(注意类的名称也发生了变化,旧类依然存在并且可以工作,但被标注为废弃的。)
  • 一些特殊的类(如DbGeography、DbGeometry)从System.Data.Spatial迁移到了System.Data.Entity.Spatial。

项目成员ajcvickers解释道,位于System.Data.dll程序集内System.Data命名空间中的EF相关类不会发生改变。

在更新项目的using语句之前,需要移除对System.Data.Entity.dll的引用。否则将混合使用Entity Framework的新旧版本。

还要注意的是,Entity Framework 5的第三方提供程序与EF 6不兼容。因此如果使用的不是SQL Server或SQL Server Compact Edition,则需要更新提供程序。这些改动很小,只是一些基本的东西,如覆盖IsGeographyColumn和GetGeographyAsync。

Entity Framework 6.1.1 发布及下载

今天我们很高兴地宣布EF6.1.1的可用。此包括一些修补程序版本

Entity Framework

EF6.1.1都有什么?
首先大家可以到CodePlex上6.1.1的页面浏览
我们从实践中反馈一系列的修改包括有:
1设计器在基于EF5 edmx打开时对小数精确报错
2 在与Sql server 2014 中默认localDb不工作的情况
EF6.1.1都有那些新增?
NuGet已经可以使用,如果使用Code First就不需要安装工具,更多可以在下面页面查看资料
在使用Model First和Database Fist 在中Visual Studio 2012 and Visual Studio 2013可以直接在微软下载中心下载

感谢团队

接下来的个工作是发布Entity Framework 7为目标继续工作,发布 7 的路线图