Share via


Entity Framework 6: Alpha2现已发布

[原文发表地址]  Entity Framework 6: Alpha2 Now Available

[原文发表时间] 2012-12-11 16:10

Entity Framework团队最近宣布了EF6的第二个alpha版本。Alpha2 的程序包可以从NuGet下载。由于这是一个预发布包,请确保在NuGet软件包管理器中选中“Include Prereleases(包含预发布)“,或者从软件包管理器控制台中执行下面的命令来安装:

PM> Install-Package EntityFramework -Pre

本周alpha版本在以下几个方面包含了一些很大的改进:

  • 当在.NET 4.5上运行时,异步语言支持现在可用于查询和更新。
  • 自定义公约现在能够覆盖默认的公约,这些默认的公约是Code First用于映射类型,属性等等到你的数据库中的。
  • 拥有完整的Code First迁移支持,多租户迁移允许同一数据库由多个上下文使用。
  • 在LINQ查询中, Enumerable.Contains被EF更有效地处理了, 从而SQL Server提供程序大大地提高了性能。
  • EF6(异步除外)的所有功能都可以在.NET 4和.NET 4.5上使用。这包括枚举和空间类型支持和性能的提升。
  • 由于改进的视图生成性能,许多大型模型的启动时间已经得到显着提高。

以下是关于上面描述改进的更多详细信息:

异步支持

.NET 4.5引入了基于任务的异步模式,使用asyncawait关键字,使得编写异步代码更容易了。 EF6现在支持这种模式。这对ASP.NET应用程序来说非常好,因为数据库调用可以通过EF异步处理 - 避免任何工作线程的阻塞。这可以增加在服务器上的可扩展性,通过允许更多的请求被处理,同时等待数据库响应。

下面的代码显示了一个MVC控制器,查询数据库的位置实体的列表:

 public class HomeController : Controller
   {
       LocationContext db = new LocationContext();
  
  
       public async Task<ActionResult> Index()
       {
           var locations = await db.Locations.ToListAsync();
  
  
           return View(locations);
       }
   }

注意上面调用新ToListAsync方法时的await关键词。当Web服务器访问这个代码,等待返回结果时,它初始化数据库的请求,而不是阻塞,处理请求的线程会返回到线程池,允许ASP.NET处理同一个线程传入的其他请求。换句话说,一个线程只会在有实际的处理工作要做时才被使用,这允许Web服务器处理同一资源的更多并发请求。

EF涉及异步更详细的演练提供了更多信息和示例。另一演练还展示了如何在一个ASP.NET MVC应用程序中使用异步

自定义公约

当使用EF的Code First时,默认的行为是使用一组公约映射.NET类到表。例如,Code First将检测到以“ID”结束的属性,然后自动配置它为主键。

然而,有时你不能或不想遵循这些公约,宁可提供自己的。例如,也许你的主键属性都是以 “Key”结束,而不是“id”。自定义公约允许覆盖默认的公约或添加新的公约,从而Code First可以按照公约映射,为您的项目使用任何规则。

以下的代码演示了使用自定义的公约来设置所有小数精度为5。与其他Code First 配置一起,这些代码被放置在覆盖派生的DbContext类的OnModelCreating方法内:

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
      {
          modelBuilder.Properties<decimal>()
              .Configure(x => x.HasPrecision(5));
  
  
      }

但是,如果有几个地方的十进制属性应该有不同的精度呢?正如与所有现有的Code First公约一样,这个新的公约可以被覆盖掉一个特定的属性,仅仅通过使用API或数据注解显式地配置该属性。

有关自定义code First公约的更详细说明,请点击这里

社区参与

前一段时间我写了一篇博文,关于EF在开源许可证下发布。自那时以来,许多社区成员都作出了贡献,这些都包含在EF6 alpha 2中。

社区贡献两个例子:

  •  AlirezaHaghshenas贡献了一个变化,通过改进了视图生成的性能,为较大的模型提高了启动性能。这个变化意味着不需要经常使用预先生成的视图。
  •  UnaiZorrilla给EF贡献了第一个社区功能:能够在一个程序集中用单个方法调用加载所有Code First 配置类,如下:
 protected override void OnModelCreating(DbModelBuilder modelBuilder)
 { 
        modelBuilder.Configurations 
            .AddFromAssembly(typeof(LocationContext).Assembly);
 }

此代码将查找和加载所有继承EntityTypeConfiguration<T>或ComplexTypeConfiguration<T>的类 。这将减少上下文和Code First配置类之间的耦合,对于大型模型也是一个非常方便的快捷方式。

EF6上其他即将发布的功能

EF CodePlex 网站上,可以找到大量关于EF6的开发信息,包括一个线路图,它显示了计划在EF6上实现的其它功能。

一个好的即将发布的功能是连接弹性,这将自动化进程,重新尝试数据库操作在云环境中常见的瞬态故障,如在Windows Azure SQL Database的数据库。

另一个经常被请求的功能将包含在EF6中,即当使用Code First时,能够在实体上映射存储过程来查询和更新操作。

总结

EF6是Entity Framework的第一个开源版本,正在CodePlex上开发。EF6的Alpha 2 预览版现在可以在 NuGet上访问,包含一些真正好的功能,您可以去尝试一下。

EF团队一直在寻找来自开发人员的反馈 - 尤其是有关新的功能,如自定义的Code First公约和异步支持。您可以在EF6 alpha 2 发布后发表评论来提供反馈,在CodePlex网站上开始讨论提交一个bug

希望这会有所帮助,

Scott

附录:除了博客之外,我现在也使用Twitter去快速更新和共享链接。在twitter.com/scottgu上关注我。