标签存档:EF6

EF6还是EF核心?我该如何选择?

十月下旬,我说话去势.我的一个课程叫EF6还是EF Core?我该如何选择?因为我从最早的时候起就一直是英孚的权威,人们经常问我这个问题,这激发了谈话。

会话未录制,但我正在共享幻灯片共享。我将在接下来的多元视野课程中详细讨论这个话题,“EF核心:开始行动”我现在正在建造的。看我的多视角作者页面以及twitter.com/julielerman和这个博客!)

与此同时,这是一个链接,指向DevIntersection Talk中的幻灯片。ef6-or-ef-core

多元化视野下的企业课程全新EF

我的孩子在这儿!一个全新的企业实体框架yabo官网.

[参见:新英孚多元视野核心课程!]

2012,我发表了一个名为企业实体框架的多元视野课程。yabo官网从那时起我学到了很多,最重要的是,我变得非常活跃领域驱动设计,甚至出版DDD基础知识我和史蒂夫史密斯共同创建的课程。这对我如何设计和构建软件产生了很大的影响,反过来,我如何将ef整合到大范围内,复杂的应用程序。

我一直想重做那门旧课程来分享我的新观点。我终于在今年一月开始工作了,但有3个月的会议旅行暂停。所以,当我感觉自己像个婴儿一样,花了9个月,实际上只有6个月。还很长时间!

课程现在开始直播!企业实体框架yabo官网

在这个过程中,我使用VS2015和EF6。为什么是EF6?因为EF核心太新了。我讨论和演示的大多数模式完全适用于EF核心。有一件事是EF核心中还没有的:价值对象,但这就要来了。此外,测试模块的重点是模拟,没有考虑到EF核心的新内存提供者。除此之外,您也可以使用在这里学习的EF Core。

我在这门课上花了很多心思,我认为这篇关于这门课讨论论坛的评论表达得很好:

我三周前刚看过朱莉·勒曼之前在企业中的实体框架,yabo官网在新课程发布之前,我很高兴她更新了课程。我认为之前的版本有点过时了(2016 vs 2012 & EF6 vs EF4),而且朱莉所说的演示软件也有点基础。这个更新后的课程将详细介绍架构项目,使用EF6改进了MOQ测试,以及更好地解释使用模式来分隔区域的有界上下文的DDD。我已经对英孚有了很好的了解,DDD,储存库,哎哟,在观看之前,虽然我不会在自己的应用程序中以100%的方式设置内容,但它们确实启动了一些重构,并重新思考了如何维护我的解决方案,这就是这些课程的目的,随着技术的发展,提供新的想法,就像实体框架一样。yabo官网感谢您更新课程和观看过上一版本的人,一定要给这个新的手表。

形象

即将开设的英孚多元视野课程

9/14:有人告诉我“再过几天”。相信我,我和任何人一样渴望这个被释放!

9/23:在这里!!!!

https://app.pluralsight.com/library/courses/entity-framework-enterprise-update/table-of-contents

年初,我在企业课程中开始了我的EF的全新版本。那一个已经有多年了,在dbContext和code首次出现之前就已经使用了ef4。在我开始学习领域驱动设计之前。

在我的日程安排中有很多岔路,包括3个月的会议旅行,以及很多关于如何解释和演示这些概念的思考。但我昨天终于完成了最后一个模块。我有一些工作要做,以响应一些模块的技术审查,我必须做一些可怕的任务,为几个模块提出问题。但接下来,它将准备好让多元论者推动并出版。我想不会太久的。

这门课我用的是EF6,大多数想法也适用于EFCORE。

与此同时,我可以告诉你这门课程的8个模块的标题,它们的总学时似乎不到5个小时:

  1. 构建数据层
  2. 了解ef封装和伟大的知识库辩论
  3. 使用EF6实现封装模式
  4. 管理复杂域和数据模型:来自DDD有界上下文的经验教训
  5. 重构领域驱动的设计边界上下文:一个演练
  6. 处理断开连接的图的状态
  7. 用实体框架映射DDD域模型yabo官网
  8. 在涉及实体框架时测试应用程序yabo官网

请点击这里查看新课程:bit . ly / PS-Julie

使用json数据和ef核心为数据库种子

我已经习惯了使用标准代码(C和EFAPI)让EF帮助我创建数据库。你知道的,实例化一个对象,填充其字段,可能向相关列表添加对象。然后将整个kit n'kaboodle添加到dbcontext并调用savechanges。

我向Geoffrey Grossenbach展示了一些EF Core代码,当时我们正在讨论如何在我开始认真学习一门更严肃的课程之前,在EF Core上为Pluralsight做一个接一个的演示。Geoffrey查看了所有用于构建我的对象来创建数据库的代码,然后说:“哇,代码真多。你不能用JSON之类的吗?”(注意:我已经厌倦了在WordPress中对代码进行漂亮的格式化,但你明白了……对吗?)

private static list buildWeatherEvents()var events=new list weatherEvent.create(datetime.now,weatherType.sun,新名单
         
          {new []{"Julie","Oh so sunny!"}}),WeatherType.Rain WeatherEvent.Create (DateTime.Now.AddDays (2)),weatherEvent.create(datetime.now.adddays(-3),weatherType.sun,新名单
          
           新的[]“朱莉”,“哦,可爱的夏日阳光!太糟糕了,我在电脑上“,新的[]“佛蒙特州的每个人”,“万岁,我们去玩吧!”新[]{“桑普森”,“我想去游泳,求求你!”}}weatherEvent.create(datetime.now.adddays(-4),weatherType.cloudy)weatherEvent.create(datetime.now.adddays(-5),weatherType.rain),weatherEvent.create(datetime.now.adddays(-6),weatherType.sun);var lastevent=weatherevent.create(datetime.now.adddays(-1),WeatherType.Snow,新名单
           
            新的[]“朱莉”,“雪?七月?好吧,这对VT来说也是荒谬的!”});lastevent.reactions.firstOrDefault().comments.add(new comment text=“get over it,朱莉!”(});事件。添加(lastevent);返回事件;}
           
          
         

哦,那会是多么漂亮啊。下面是我如何用ef-core完成的,但是你当然可以用同样的概念来处理ef6。

我的域是weatherevent,它是我的efcore演示中的域,位于https://github.com/julielerman/efcore-aspnetcore-webapi-rtm,(我还没有更新它来演示如何使用JSON数据)。

这是我存储在一个名为weatherdataset.json的文件中的JSON。

[{"date": "2016-07-27T00:00:00",“time”:“22:09:13.8216230”,“类型”:5,“reactions”:[“name”:“朱莉”,“引述”:“哦,阳光明媚!”,“comments”:[]],“mostcommonword”:空,“日期”:“2016-07-25t00:00:00”,“time”:“22:09:13.8237230”,“类型”:1,“反应”:[],“mostcommonword”:空,“日期”:“2016-07-24t00:00:00”,“time”:“22:09:13.8238740”,“类型”:5,“reactions”:[“name”:“朱莉”,“引言”:“哦,可爱的夏日阳光!太糟糕了,我在电脑上。“评论”:[]},“name”:“佛蒙特州的每个人”,引文:“万岁,我们去玩吧!”“评论”:[]},“name”:“sampson”,“引言”:“我想去游泳,求求你!”,“comments”:[]],“mostcommonword”:空,“日期”:“2016-07-23t00:00:00”,“时间”:“22:09:13.8239130”,“类型”:6,“反应”:[],“mostcommonword”:空,“日期”:“2016-07-22t00:00:00”,“time”:“22:09:13.8239210”,“类型”:1,“反应”:[],“mostcommonword”:空,{“日期”:“2016 - 07 - 21 t00:00:00”,“time”:“22:09:13.8239290”,“类型”:5,“反应”:[],“mostcommonword”:空,“日期”:“2016-07-26t00:00:00”,“time”:“22:09:13.8239360”,“类型”:2,“reactions”:[“name”:“朱莉”,“引用”:“雪?”七月?好吧,这对VT来说也是荒谬的!”,“comments”:[“text”:“克服它,朱莉!”}],“mostcommonword”:空]

所以这不仅仅是数据,但是具有三个层次关系的层次数据。在JSON中表达它要容易得多,更漂亮,而且可读的比把这些都建在C,创建对象,等。

现在当然是魔法的时候了JSON.NET这样就可以将这些数据简化为ef。

这是我用来从使用ef的JSON中为数据库种子的完整代码。

我在configure方法内的ASP.NET核心Web API中从startup.cs调用它。这里我只是用system.io.file.readalltext读取文件,然后将该文本传递到seedit方法中。还要注意我在其中设置dbContext的配置服务及其所需的连接字符串。

注意:这篇文章中的代码有一些变动韦尔德莫斯我和戴夫·福勒在Twitter上学习过,aspnet团队的核心领导者之一。我根据肖恩的一个伟大建议修改了我的原始代码以简化它,但是Dave指出了其中的一些范围问题。所以现在样本又回到了我原来的版本,其中seedit方法负责创建一个新的ServiceScope并实例化上下文。

public void配置服务(IServiceCollection Services)services.adddbContext
         
          (options=>options.usenpgsql(configuration[“data:postgreconnection:connectionString”]);services.addmvc();}公共void配置(IApplicationBuilder应用程序,环境卫生部,iloggerFactory)loggerFactory.addconsole(configuration.getsection(“logging”));loggerFactory.adddebug();app.UseMvc ();var datatext=system.io.file.readalltext(@“weatherdataset.json”);Seeder.Seedit (dataText app.ApplicationServices);
          }
         

这是Seedit方法,它使用json.net将json反序列化为weatherEvent对象列表。契约序列化程序将克服WeatherEvent类中的私有setter。我从这里得到的Daniel Wertheim的Github回购.然后,我使用ASP.NET核心服务提供程序获取在启动时设置的服务,该服务将实例化weatherContext以及在启动中指定的连接字符串。

使用系统;使用system.linq;使用system.collections.generic;使用Microsoft.Extensions.DependencyInjection;使用efcorewebapi;使用Newtonsoft.Json;使用JsonNet.PrivateSettersContractResolvers;公共静态类seeder公共静态void seedit(string jsondata,iServiceProvider ServiceProvider)JSonserializerSettings settings=new JSonserializerSettings ContractResolver=new privateSetContractResolver()表
         
          事件=jsonConvert.DeserializeObject
          
           >(詹森达,设置);使用(var serviceScope = serviceProvider .GetRequiredService
           
            ().CreateScope() {var context = serviceScope .ServiceProvider.GetService
            
             ();if (!context.WeatherEvents.Any()) {context.AddRange(events);context.saveChanges();}}}}
            
           
          
         

实例化上下文之后,我要检查一下数据库中是否有天气事件,这样我就不会重新播种了。(这是我在我的演示期间想要播种的逻辑,因此您可能对播种有不同的规则。)现在,我在WeatherEvent对象列表中调用Context.AddRange传递。我可以直接使用dbset或上下文调用addrange。最后,保存更改。

关键是,无论您使用的是efcore还是ef6(所以服务的使用是特定于我的应用程序是aspnet核心API这一事实)。只是在读取JSON文件,反序列化数据并将其添加到上下文中。这比强制性地创建所有数据要简单得多。

根据您的数据的形状,它可能并不总是答案,但对于这个特定的模型和我需要的种子数据来说,它是完美的。

实体框架,yabo官网时间跨度和SQL Server时间

在“嘿,你不能什么都知道”类别…

今天,一个客户机问我一个关于将时间跨度映射到SQL Server中时间数据类型的问题。

我不知道SQL Server中有时间数据类型。我很清楚2008年夏季奥运会的数据类型,但我跳过了另一种新的类型。

因为我从未使用过时间数据类型,我从来没有机会和英孚一起使用它。所以当我的客户提到时间跨度时,我想“那不可能是对的”。时间跨度与间隔有关,不是时间点。然后他说了一些关于datetime.timeofday属性的内容,它返回一个时间跨度,我就是

bsi

所以…

步骤1:在具有日期字段和时间字段的SQL Server数据库中创建表。

形象

第二步:逆向工程到代码优先(我使用了EF6设计器)

公众的部分的分离日期时间{公众的intID { get;集合;}[弦长(50)]公众的一串SomeString获取;集合;}[列(类型名)=“日期”公众的日期时间justdate get;集合;}公众的TimeSpan JustTime获取;集合;}
好吧,就是这样:时间跨度
步骤3:编写一些代码来测试它:
私人静止的无效InsertSeparatedDateTime () {使用(var上下文=新的datetimeTester())context.separatedDateTimes.add(createSpedt());context.database.log=console.writeline;context.saveChanges();}私人静止的分隔的datetime CreateSepDT() {var sepDT =新的SeparatedDateTime();分离somestring=“测试”;sepdt.justdate=datetime.now.date;sepdt.justtime=datetime.now.timeofday;返回SEBDT;}
步骤4:调试。
检查sepdt.justtime值,它看起来是这样的:它是从午夜开始的毫秒,有很多种类型
形象
日志显示ef已将该值转换为插入的时间值:
形象
当然,当从数据库中读取数据时,情况正好相反。
一些注意事项:
  • 24小时
  • 假定您正确计算了时间跨度值
  • 与UTC相关的所有注意事项

        

        

        

        
        
        
        
        
        
        

最近的数据点列:Aurelia,Azure DocumentDB,Scriptcs,EF6,EF7,ASP.NET 5

数据点——Aurelia满足DocumentDB:
一个媒婆的旅程
(第1部分)

*第2部分将在2015年12月发行

11月2015日

在探索了documentdb和新的aurelia框架之后,Julie Lerman决定是时候一起使用它们了,yabo官网但事实证明,这比预期的要困难。了解她如何最终找到正确的解决方案。

读文章

数据点-重新访问javascript数据绑定-现在使用aurelia

SEP 2015

JulieLerman长期以来都是精采的JavaScript框架及其数据绑定能力的粉丝。yabo官网在这里,她探索了新的奥雷里亚框架,这正迅速获得Web开发人员的支持,并且发现它为面向数据的程序员提供了很多喜欢的东西。

读文章

使用脚本探索命令行中的实体框架行为yabo官网

朱尔2015

JulieLerman学习如何使用脚本交互地探索实体框架行为。yabo官网

读文章

Microsoft Azure DocumentDB概述

军2015

JulieLerman首先查看了文档数据库字段azure documentdb中的Microsoft条目。yabo官网

读文章

EF6,EF7和
ASP.NET 5汤

2015年5月

Julie Lerman讨论了下一个版本的.NET和运行ASP.NET 5应用程序的区别,yabo官网然后解释实体框架6和实体框架7如何融入到组合中。yabo官网

读文章

EF6多个模型的代码优先迁移

APR 2015

实体框架6中对代码优先迁移的新支持使在单个数据库中存储多个模型的数据更加容易。yabo官网但这种支持可能不是你想象的那样。Julie Lerman解释了这个功能的功能和功能,yabo官网以及如何使用它。

读文章

期待
实体框架7yabo官网

一月2015日

在第一次看EF7时,Julie Lerman讨论了EF7将给开发人员带来什么,yabo官网关于框架的决策背后的动机,这个版本对使用EF6或更早版本的现有应用程序意味着什么。

读文章

在Pluralsight上开始EF6课程

形象

你可能认为你读错了标题。她是指EF7吗?不,实际上我花了一些时间创造了一个新的EF6入门当然,即使EF6是18个月前发布的。当EF6被释放时,EF5之后的大部分变化是高级特性和使用。我学了一门叫做“的课程。EF6 Ninja Edition:实体框架6的新特性yabo官网”具体包括这些增加/改进。但对于“水中的脚趾”先看看英孚,EF5和EF6之间没有太大的变化,因此开始EF5课程仍然相当相关。

观看开始使用实体框架6yabo官网

那么,为什么现在开始使用EF6,当EF7似乎在拐角处?好吧,EF7还需要一段时间。即使是“测试版6”最近宣布,该团队以一种重要的方式表示,EF7测试版6仍然是“非常好的预演”。EF7的。预计EF7的预发布将于2016年初与AspNet5一起发布。但是EF7的RTM仍然比那个日期要远。甚至在那时,不是每个人都会立即使用EF7。

因此,EF6将在很长一段时间内面世,我决定开设一门课程来解决直接使用EF6的入门问题,包括使用最新版本的Visual Studio–VS2015。

第一个模块是一个概述,它不仅是为开发人员设计的,甚至是为您的经理设计的,他们可能希望更好地了解什么是EF,以及它如何适合您的总体计划。

我还致力于创建两个更多的EF6课程的多元化-也为了长期的资源。这些将巩固我多年来创建的关于EF3.5 - 6的各种课程中的信息。一个是EF6基础,另一个是先进的EF6。

与此同时,我将更新“展望EF7”当然要反映beta 6,因为从beta 3开始事情就发展了。

EF6忍者版课程实况转播

这是一段漫长的等待。我开始学习这个课程,然后切换档位领域驱动设计基础史蒂夫史密斯的课程。当我回到EF6课程工作时,一些小版本和补丁版本已经发布了,所以我不得不修改我已经记录的大部分内容,编辑和制作。

但是今天,最后,整个课程已在Pluralsight上发表。

实体框架6:忍者版yabo官网
—EF6的新功能

有点超过7个小时。如果我再写一本大书的话,我会这么做的。所以如果你在找我的下一本书,看这门课!你可以回去参考一下。

如果你没有一个多元化的订阅(老实说,如果你只想订阅这个课程,每月29美元的费用,比那些大书还少,寄给我一张便条我会给你发一个代码供你试用。您可能很快就会意识到,您希望订阅一个服务来继续访问这个庞大的库。

课程描述

实体框架6对EF进行了重大改进,使开发人员能够将其数据访问与高级软件实践保持一致。yabo官网EF6最大的新闻是它是开源的,并且从开发人员社区的投入中获得了很多。具有广泛吸引力的特性,如代码优先的存储过程映射,在执行查询和命令时支持异步/等待模式,单元测试的简单模式,而且内置的数据库日志记录功能已经获得了很大的可见性。EF6现在可以通过自定义迁移进行扩展,自定义映射规范,以及引入依赖注入模式来打开低级dbContext配置。有新的方法和属性允许更简单和更智能的编码模式。而不是提供一个新功能的高级列表,本课程深入探讨EF6的每一个新特性,确保你不仅了解它的用途,但它是如何工作的,您可以从中受益的场景,你应该小心点。本课程全面介绍了EF6在实体框架中的作用。yabo官网它将使你能够真正受益于所有的忍者力量,已添加到这个版本的英孚。

课程纲要

EF6的新功能概述

介绍

什么是实体框架?yabo官网

这门课上有什么?

这个模块里有什么?

实体框架的简史yabo官网

为什么是EF6?

绕着英孚的codeplex网站一圈

EF设计器更改概述

新功能概述

EF6中还没有

总结

资源

去EF6

介绍

在这个模块中

使EF6进入新项目和旧项目

将项目更新为EF6

总结

资源

性能和稳定性改进

介绍

在这个模块中

更快地处理Linq的可枚举包含

更快的映射视图生成

使用NGEN“预JIT”EF6程序集

重用打开的数据库连接

创建可伸缩性更强、更不容易发生死锁的DBs

临时数据库连接的连接恢复性

挖掘连接弹性特性

快速复查

资源

EF工具的变更

介绍

EF设计师历史

在这个模块中

EF设计器的新MSI安装程序

从设计器中的数据库创建代码优先模型

代码优先模型中的数据库视图

自定义代码优先设计器模板

重构生成的POCO和模型

有关命名与数据库中的代码先发生冲突的警告

空代码第一模型向导做什么?

将代码优先模型向导与EF电动工具进行比较

在新设计器中使用EF4或EF5

模型第一工作流的显著变化

为什么您仍然需要EF电动工具

快速复查

资源

代码优先的存储过程映射

介绍

在这个模块中

了解EF存储过程映射

可视化存储过程映射

基于设计器和代码优先模型映射之间的差异

由代码优先创建的过程的约定

自定义映射以使用现有存储过程

快速复查

资源

自定义代码优先约定

介绍

在这个模块中

自定义代码优先约定:为什么要它们?

使用轻量级约定的自定义约定基础

使用属性指定自定义约定

封装的习俗惯例

理解和控制执行顺序

基于模型的约定

扩展现有约定

快速复查

资源

更多代码优先的好东西

介绍

在这个模块中

代码优先支持数据库索引

使用Fluent API添加索引

设置默认数据库架构

使用addfromassembly加载约定和配置

理解并修正代码首先如何复数表名

使用复数服务本地化非英语表名

在数据层中实现自定义的复数规则

映射到表值函数和存储过程的结果

快速复查

资源

代码优先迁移的增强

介绍

在这个模块中

影响迁移历史记录表的架构

使用等幂脚本进行更智能的迁移

现有迁移方法的限制

迁移如何从方法到SQL

为其他数据库操作创建自定义迁移

为什么要HasColumnAnnotation和HasTableAnnotation?

实现一个简单的表注释

实现更复杂的注释

migratedatabasetolatestversion初始值设定项的性能调整

从多个模型迁移到单个数据库

使用HasDefaultSchema和ContextKey支持多个模型

在单个项目中更容易迁移多个模型

组合数据库初始值设定项和迁移

快速复查

资源

改进了数据库交互

介绍

在这个模块中

使用Log属性进行简单的数据库日志记录

调整日志功能

用于LINQ查询的sqlce函数

介绍异步EF6方法

演示异步EF6方法的效果

感知和性能:使用异步EF6进行负载测试

快速复查

资源

基于代码的dbContext配置和拦截器

介绍

为什么要进行数据库配置?

在这个模块中

创建和触发dbconfiguration类

为什么要将配置文件设置移动到代码?

正在将连接工厂移动到dbconfiguration

将数据库初始值设定项移动到dbconfiguration

新的空数据库初始化器

提供程序服务和数据库配置

用拦截器接入管道

超越拦截器基础

dbcommandinterceptor在管道中做了什么停止?

构建用于数据库日志记录的拦截器

利用拦截器解决复杂问题

理解依赖解决的作用

在外部程序集中承载数据库配置

快速复查

资源

有时是小事情

介绍

在这个模块中

EF6和模拟框架

将测试写入模拟方法,如dbset.find

编写测试以模拟LINQ查询

嵌套实体和复杂类型

修正模糊类型问题

自定义等于vs.更改跟踪器等于

更智能的LINQ到实体查询

对,你可以用haschanges来处理变化

快速复查

资源