EF7 RC1 notes—对我的Pluralsight“为实体框架7提前规划”的更新yabo官网课程

2015年初,我发表了一门名为展望实体框架7yabo官网”。这是使用早期版本的工作创建的,EF团队正在对实体框架进行全面更新。yabo官网

这个版本被称为beta 4,尽管它的延展性仍然很好,英孚团队甚至把它称为alpha。事实上,它有“beta 4”标签的唯一原因was to align with the set of Nuget packages that were being released for ASP.NET 5 as it was developing.EF7的一个重要目标是它需要与ASP.NET 5一起工作,因此,EF团队需要在nuget.org上发布稳定的预发布版本(例如http://www.nuget.org/packages/EntityFramework.Core/) in sync with ASP.NET 5.夜幕降临,在哪能买到https://www.myget.org/gallery/aspnetvnext这是一个不同的故事,每当英孚团队准备好这样做的时候,他们都会经常被推。

自从课程发布以来,一些技术性的东西发生了变化,甚至发布计划也发生了变化。而不是每次都更新课程,可能会引入更多RTM会改变的东西,我会等到EF7更接近RTM,然后用它创建一个关于发布的课程。

与此同时,我认为重要的是要对当前的风景有一些了解,以便与观看相结合展望实体框架7yabo官网,你可以有效地提前计划。我的建议是,至少在看这门课之前仔细阅读这篇博客文章,然后再回来仔细阅读,当它更有意义的时候。

在这篇文章中,我将介绍beta 4课程的6个模块中的每一个模块,并提醒您已经发生了什么变化,以及将会发生什么。

模块1:利用EF7实现微软的EF目标

EF7的首要目标没有改变。微软完全致力于使用现代软件实践为EF7建立一个全新的代码库。新设备“新数据存储”的目标仍然是正确的,正如您所了解的(或在观看课程时将学习的)。围绕NoSQL和Redis的概念验证仍然被搁置一边。

在讨论在哪里可以使用EF7时,我展示了一张关于各种框架的幻灯片。

clip_image001

由于EF7最初的RTM现在将支持UWP(通用Windows平台),目标是包括手机和平板电脑在内的Windows 10设备,所以这种情况发生了一些变化。随着这一变化,已预留的sqlite提供程序,现在是初始RTM的一部分。在课程中,我解释说,Windows Phone 8和Windows Store支持也被保留到初始RTM之后的后续版本中。现在依然如此。

以下是我为最近一次会议创建的幻灯片的更新版本:

clip_image002

对第一个模块的另一个更改与时间轴有关。I explained how EF7 was going to focus on being able to release alongside of ASP.NET5 which meant setting aside of of the goals that they wanted to achieve.我还解释了当ASP.NET 5发布时,我们会得到一个EF7的版本,它仍然被称为预发布版,不是RTM。这是我在讨论这个时间表时使用的幻灯片。

剪辑图像003

这些计划有些改变。虽然最初以ASP.NET为中心的EF7版本仍然是团队希望在EF7中实现的所有版本的子集,现在它将是一个完整的版本,一个RTM,不是一个预发布。因此,在发布ASP.NET 5的同时,将发布EF 7.0.0。

然而,没有改变的是:

·EF 7.0.0仍然是“缩写”的版本。

·团队关注的特性是那些与Web应用程序很好地协调的特性。一个很好的例子是,他们正在努力改善与断开连接的实体之间的体验,并预留了一些神奇的关系特性,例如显式和延迟加载。

·EF 7.0.0不会成为“官方”实体框架的版本。yabo官网

·EF6将继续作为官方版本。

·当您通过nuget安装EntityFramework时,将继续提供EF6。

·使用EF6的应用程序不会自动更新为EF7!

·通过nuget安装软件包时,您不需要使用“-pre”区分EF6和EF7。
EF6将继续使用安装包EntityFramework进行安装。EF7没有简单的旧EntityFramework包。你可以从你想要的供应商(例如:这将引入所有依赖关系,例如。entityframework.core and more.因为这是EF7的完整RTM,您将不再需要使用-pre。

同时,我们现在已经在他们的Github wiki上有了一个相当清晰的来自EF团队的路线图。最重要的是,2015年11月发布了EF7(以及ASP.Net5)的RC1(带上线的候选版本)版本。According to the ASP.NET 5 roadmap,二月份将有一个RC2,RTM的目标是2016年第一季度。There will be a big change Another notable point on the ASP.NET 5 website is the lack of Visual Basic support until possible Q3 of 2016.

根据路线图,EF7将在将来的某个时候成为正式版本,那时团队会觉得他们已经实现了大量重要的ORM特性。

以下是我在最近的会议发言中使用的上述时间线幻灯片的更新版本:

CclipIMAGE04

模块2:针对EF7的初始和未来版本

在最初版本中收集到的东西的列表并没有发生显著的变化,除了现在,正如上面提到的,EF7还将支持UWP应用程序。

Re VS *& . net版本。虽然ASP.NET 5可以在DNX环境中运行,它也可以在一个完整的。net框架环境中运行。在课程中,该公司表示,在4.5及以上版本中,这将是可能的。现在它将用于.NET 4.5.1及更高版本。我认为未来的版本根本不会恢复到支持4.5。

安装:如上所述,最新的稳定版本可以在Nuget.org上找到。(今天是RC1)夜间构建可以通过myget包源代码(https://www.myget.org/gallery/aspnetvnext)获得。该团队目前正在夜间建造RC1。在这个月(2015年11月)的某个时候,一个稳定的RC1版本将在Nuget.org上发布,这就是“-pre”标签。

在beta4中,仍然有一个名为entityframework的EF7包。不再存在,使我们能够使用该包名称专门针对EF6。对于EF7,最简单的方法是从您想要的提供者开始,然后这将删除所有相关的依赖项。举个例子
安装包entityframework.sqlite”会把包裹取下来,关系包(包括迁移支持)核心包和其他包。

别忘了migrations命令位于单独的包中:entityframework.commands,如果要在nuget或dnx环境中执行迁移,则需要显式安装。

这一点很重要:“k运行时”现在是“DNX运行时”。

现在运行的所有命令都从dnx开始,不是k。

例如:

dnx ef迁移添加

使用概念验证功能Windows Phone 8和Windows商店应用程序对精简框架的支持被搁置,目前仍处于这种状态。这些dll并不容易获得。我在课程中使用的访问这些程序集的技巧可能仍然有效,也可能不再有效。我还没有测试过。请记住,SQLite程序集现在是EF7的一部分,所以很容易获得!如果你能用EF7瞄准Windows 10手机和平板电脑应用。

模块3:使用EF7查询和更新(断开连接的图形变化!)

自从我用beta4创建这门课程以来,大部分的变化都是围绕语法展开的。即使在课程中,您也可以看到,起初团队正在重命名方法,以更好地适应他们希望的命名方式。例如,rather than have DbSet.Add and DbSet.AddRange,他们修改了add以接受接受范围的重载。但就在我推进课程之前,他们把方法改回了adding,专门为一个范围添加了taking和add range。这样做的原因是为了减少对API的更改。这可能是与EF6向后兼容的东西。随着EF7的发展,出现了许多这样的变化,其中一些语法被还原为更好地与EF6对齐。甚至行为也发生了变化。Add是另一个例子。EF6 and earlier had a pattern of [almost] always affecting full graphs when you pushed a root of a graph into the context with Add/attach/Delete or using the Entry().State property.而且效果并不一致。他们尝试通过添加(etc)和输入(entry.state)来完全分离行为,只影响根,然后给我们一个新的方法changetracker.addgraph-soley来处理图。从beta4开始,这个团队已经缩小了对这个问题的最终发言权的范围。这里是:

DbSet.Add,添加范围,附上,AttachRange更新,UpdateRange:这些方法现在接受一个新的第二个参数enum,GraphBehavior.

GraphBehavior值是includeDependents和singleObject。

上述方法的默认值是graphbehavior.includeDependents,这意味着a只是以熟悉的方式使用它,例如。:

context.Samurais.Add (myNewSamurai);

会导致“几乎”熟悉的行为。捕获(这是一个很好的改进,在我看来)是默认行为,IncludeDependents,从字面上看是为依赖对象。它不会包含所有相关的对象。区别很重要。关系中的对象要么是主体(也就是“父对象”),或依赖他人(又名“孩子”)。在数据库中,它们很容易区分,因为依赖项是将外键放回主体的那个。

考虑以下主要到从属关系:

订单–>行项目

人->地址

类别->产品

创建一个新的订单是有意义的,向其中添加一些新行项目,然后通过调用context.orders.add(order)添加该订单图。在这种情况下,所有相关行项目都将包含在操作中,即也标记为已添加。

将地址记录添加到一个人,然后将该人添加到上下文中是有意义的。context.People.Add(人)。再一次,从属地址将标记为已添加。与之相关的产品类别也是合乎逻辑的。

如果出于某种原因,您创建了一个新的行地址实例,然后通过设置someAddress.Person=somePerson来标识该实例的人,然后通过context.addresses.add(someaddress)添加该地址,EF7不会将父/主体对象(某人)标记为已添加。添加一个新地址并不一定意味着你要添加新的人,所以英孚不会做出这样的假设。我还喜欢用负责相关数据行为的聚合根来构建模型。所以我不允许我的tyeps以这样一种方式使用,我的API的用户可以创建一个地址并随机添加它。所以这种行为与我推荐的编码模式是一致的。

它还解决了另一个问题,我经常看到devs使用对象实例来指定引用属性。我总是建议为此使用外键属性,但我知道许多程序员都有以下问题。

想象一下这个场景:

用于创建或编辑订单的表单有一个地方可以为客户输入新的发货地址。其中一个字段是“Region”的下拉列表(就我而言,在美国那将是一个像佛蒙特州或犹他州那样的州)。我查询区域对象列表并填充下拉列表。

clip_image005

我选择Vermont,然后我的代码执行如下操作:theory . theaddress . region =(region)List.SelectedItem。我使用context.Orders.Add(order)添加订单并调用SaveChanges。

下一个去添加地址的人看到的是:

CclipIMAGE066

两个佛蒙特州!这是因为在EF6(以及更早的版本)中,图中的所有内容都被标记为add, EF将Vermont对象插入数据库,即使它已经在那里。

在这种情况下,模型将区域视为主要的地址为依赖因为地址有一个返回区域的外键。EF7不包括委托人。只有地址将被插入,作物被保存!

添加、附加和更新:仅根目录

所以,Add的默认值,添加范围,更新,UpdateRange,attach和attachrange将包括从属项。使用参数,您可以指定singleobject枚举,然后该方法只影响图形的根实体。

dbContext.Entry().State

在RC1中,这与我在课程中解释的相同:如果您指定一个图形中的实体,只有该实体才会受到设置状态的影响。作为图形一部分的任何其他对象都不会被触及。

changetracker.addgraph已更改为changetracker.trackgraph

签名是一样的,你传递一个图表和一个lambda函数。lambda可以表示您希望图形使用的状态。

context.changetracker.trackgraph(someEntityWithRelatedObjectsAttached,e=>e.entry.state=entitystate.added);

EF会遍历图并将这个函数应用到图中发现的所有东西上,跳过已经被跟踪的对象(及其相关对象)。_此方法的一个很酷的功能(与调用addgraph时的功能相同)是该函数不必表示状态。它可以是任何你想要的函数。

dbset.find方法
这是为后RTM预留的,但该团队正在重新考虑,可能会将其用于RTM。更多信息:https://github.com/aspnet/entityframework/issues/797

模块4:使用和迁移关系数据库

在本单元中,我讨论了迁移是如何工作的,与我们在EF4.3到EF6中对迁移的使用方式有关。我还演示了如果您使用的是ASP.NET 5并且无法使用熟悉的PowerShell命令,迁移如何在k运行时命令中工作。我还解释了dbinitialalizer的神奇行为以及自动迁移将不是EF7的一部分。

自该课程基于的beta4发布以来,变化不大。团队对命令进行了更多的简化。他们引入了一种新的“应用程序迁移”替换更新数据库的命令,但是应用程序迁移已经结束,您只需要使用熟悉的update-database命令。

在ASP.NET方面,命令现在是dnx命令,不是k命令。所以,现在表达添加迁移的方法,因此是:

dnx ef移民增加了myawesommigration

与模块4中的解释相比,其他的变化不大。

有一个很好的图表在7月23日英孚设计会议记录这显示了变化。

不迁移,但是现在,这些命令支持使用脚手架命令进行逆向工程,脚手架命令有许多有用的参数来定制代码的生成方式。

模块5:EF7期货

本模块涵盖了团队正在探索的内容,但将重点放在与ASP.NET 5对齐的版本上。这些都是非关系存储(以Redis和Azure表存储作为其概念的证明),并且允许EF运行精简版的. net,该版本用于Windows 8手机和平板电脑(又称“Windows store”)应用程序,这些应用程序也依赖于新的SQLite提供程序。因为组件仍然可以访问,我展示了一个使用SQLite和Azure表存储的Windows Phone和Windows Store应用程序的演示。

Azure表存储和Redis提供程序仍然被放在一边,正如我在本单元中所解释的。

虽然EF7在发布时最初并不支持Windows8手机和存储应用程序仍然是事实,这个小组确实把sqlite带回到了EF7.0.0的折叠中。sqlite被重新点燃的原因是,如上所述,EF7现在可以在UWP(通用Windows平台)上运行,Windows10平台允许我们创建跨设备应用程序,这些应用程序也可以在手机和平板电脑上运行。这些将受益于使用SQLite。事实上,我能够用EF7和sqlite从UWP的这个模块中重建cookie应用程序,并观察它在手机和平板电脑的模拟器上运行。

模块6:与团队互动

本模块介绍了如何在github.com/aspnet/entityframework上公开开发EF7,并且故事没有改变。团队仍然希望开发人员尝试EF7,并以问题甚至拉请求的形式提供反馈。他们继续在wiki上发布团队会议笔记,我们可以在那里与他们进一步讨论他们的想法。

EF7路线图

创建课程时路线图不存在。这是一个很好的资源,我鼓励您查看https://github.com/aspnet/EntityFramework/wiki/Roadmap.

当我感到困惑的时候,我会继续使用EF7,并不断地纠缠团队。当EF 7.0.0发布时,我将创建一个入门课程,作为一个完整的发布框架,它将深入研究EF7。

关于映射的一些注意事项

因为这门课,我学到了一些东西,要么当时不存在,要么我只是不知道,我认为值得一提。

这个多元化的案例我们过去习惯的支持在EF7中不存在。如果您有一个实体名为Person和另一个名称顺序的模型,ef(&migrations)将假定相关表也命名为person和order。

下一点将帮助您处理多元化。

我们在EF6中得到的自定义约定不在RC1中,也不会出现在EF7的第一个创建中。他们的目标是未来的发布-并应在EF7成为“官方”时。版本的英孚。

所以像这样的定制约定还不可能实现:

modelBuilder.Properties (EF6 - >) ().Configure(p => p.HasMaxLength(50))

然而,罗文米勒在他的要点中指出(https://gist.github.com/rowanmiller/88261afd0baae7fb9b04)我们可以继续使用一个在自定义约定存在之前就已经存在的黑客来帮助(但不是神奇地解决)表名的复数化。感谢c# 6中引入的新名称属性(& VB,但请记住,我们还没有vb支持)您可以遍历实体并应用someo规则。罗文的要点显示了一个简单的“添加s”规则:

foreach(modelbuilder.model.getEntityTypes()中的var实体)

{

modelbuilder.entity(entity.name).totable(entity.name+“s”);

}

从RC1开始添加了对表per Hierarchy (TPH)映射的支持。

EF7现在可以推断1:1映射,而无需指定主体和依赖项。如果它没有得到正确的映射,那么您可以使用更新的HasMany/HasOne连贯映射。(这些已经被简化了!)

报名参加我的时事通讯所以你不要错过我的会议和多元化课程公告!

3“思考”EF7 RC1 notes—对我的Pluralsight“为实体框架7提前规划”的更新yabo官网课程

  1. modelbuilder.properties().configure(p=>p.hasmaxlength(50))–在当前版本中有什么方法可以这样做吗?或者在哪里查看以确定何时启用它?

留下答复

您的电子邮件地址将不会发布。必填字段已标记*

这个站点使用Akismet来减少垃圾邮件。了解如何处理评论数据.