Entity Framework7 有哪些不同?之具体功能

  前面我们介绍了关于EF7的新特性、开发计划和入门介绍。今天,我们来看看EF7的具体新功能及用法。本文中的环境,为EF7入门里介绍的环境。

  1、在Linq to Entity 查询中对列使用类型转换,请见如下代码:

 var result = db.Blogs.Where((b => Convert.ToInt32(b.IntString) == 2)).FirstOrDefault();

  代码中的Convert.ToInt32(b.IntString),对列IntString转换成Int32类型。生成SQL语句如下:

 SELECT TOP(1) [b].[BlogId], [b].[IntString], [b].[Url]
FROM [Blog] AS [b]
WHERE (CONVERT(int, [b].[IntString]) = 2)

  备注,可能不少朋友想在Linq To Entity中使用 Tostring()方法,这在EF6.1中就支持了,平常还听到不少朋友在感叹,要是EF7支持枚举就好了,其实,这个功能也是在EF6.1中就支持了。

  2、Code-First下用数据迁移更新数据库时使用修改(Alter)代替删除(Dropping)后重新创建

    在这之前,相信不少人吃过亏,因为之前模型发生变更,使用数据迁移更新数据库结构时,是先删除数据库,再重新创建,这样的问题是,会造成数据丢失。听说有人因为不熟悉这功能,把生产环境的数据也给弄丢失了。

  3、删除孤儿(orphans)记录

  这个,让我们直接举例来说明。假设我们有一个对多关系的模型,Blog和Post,在Blog实体中有导航属性Posts。在数据库中Post通过外键BlogId与Blog关联,且BlogId不能为空。如果我们在Blog实体中,使用如下方法 Posts.Remove(post); 然后调用上下文对象中的SaveChages()保存修改。按理是应该把post对象的记录给删除掉,但实际的情况是,我得到了一个异常。原因是现在EF版本是这样处理的:它把从Blogs导航属性集体中移除的post对象的BlogId设置为null,然而数据库中对应的外键又不能为null,于是保存失败。这个post也被形象的叫做孤儿(与父对象脱离了关系)对象。 EF7将会解决这一问题。代码如下:

           var result = db.Blogs.Where((b => Convert.ToInt32(b.IntString) == )).FirstOrDefault();

                 if (result != null)
{
var post = db.Posts.FirstOrDefault(p => p.PostId == );
result.Posts.Remove(post);
db.SaveChanges();
}

下图是EF6下的异常

很遗憾的是,现在EF7的最新预发行版本EF7.0.0-beta7还没有解决这个问题,但异常的内容发生了改变.

相信在后面版本会得到处理,因为EF团队已经承诺要解决这个问题。

  4、日志记录

    在日志中查看EF生成的SQL,相信这种方法帮助过不少的人(当然不是全部,因为有人还不知道有这东西,做开发就得不停的学习!)。EF6中,大家是使用类似如下的代码来记录SQL语句:

 db.Database.Log = s => Console.WriteLine(s);

    EF7中,为了使用Microsoft.Framework.Logging日志框架和依赖注入,关于日志的接口是几经变化。首先是去掉了上面的的Database.Log,在EF7.0.0-beta2中使用如下的方式:

               db.Configuration.LoggerFactory.AddProvider(new DiagnosticsLoggerProvider(
new SourceSwitch("SourceSwitch", "Verbose"),
new ConsoleTraceListener()));

    后来,微软就去掉了db.Configuration,使用如下的方式:

                 IServiceProvider contextServices = ((IDbContextServices)db).ScopedServiceProvider;
var loggerFactory = contextServices.GetRequiredService<ILoggerFactory>();
oggerFactory.AddConsole(LogLevel.Verbose);

    现在的版本中,又变成如下方式:

                var service = ((IAccessor<IServiceProvider>)db).Service;
var loggerFactory = service.GetRequiredService<ILoggerFactory>();
loggerFactory.AddConsole(LogLevel.Verbose);

    也许,后面的Beta8,RC版本还会有调整,但可以确认的是,它会越来越强。从日志接口的变化也可以看,EF7目录处于开发过程中,变化会很大。因此,文中介绍的功能,都是以目前已有的版本为基础,后面可能会变生变化,这一点要请大家注意。

 

  今天就先到这里,有点不舒服。改天再慢慢写。谢谢你的理解。

实体框架交流QQ群:  458326058,欢迎有兴趣的朋友加入一起交流

谢谢大家的持续关注,我的博客地址:http://www.cnblogs.com/VolcanoCloud/

  

Entity Framework7 有哪些不同?之具体功能的更多相关文章

  1. Entity Framework7 入门之全功能.NET版本下使用EF7(含源码)另附数据迁移常见错误处理

    Entity Framework7 入门之全功能.NET(Console, WinForms, WPF等)使用EF7 昨天,我们介绍了EF的新特性和开发计划,如果你还不了解,请移步 Entity Fr ...

  2. Entity Framework7 入门之全功能.NET(Console, WinForms, WPF等)使用EF7

    昨天,我们介绍了EF的新特性和开发计划,如果你还不了解,请移步 Entity Framework7 有哪些不同?现在开发到什么程度了? .今天,我们开学习全功能.NET(Full .NET)下使用EF ...

  3. Entity Framework7 有哪些不同?现在开发到什么程度了?

    Entity Framework7之开篇 一.Entity Framework7 简介 Entity Framework7简称EF7,是微软正在开发的最新的在.NET应用中首选的数据访问技术.它是轻量 ...

  4. Entity Framework Core 2.1 Preview1 新增功能简介

    两个星期前,微软发布了EF Core 2.1 Preview 1,同时还发布了.NET Core 2.1 Preview 1和ASP.NET Core 2.1 Preview 1:EF Core 2. ...

  5. 写一个system.data.entity的simpledatarepo,实现crudq这些功能,不需要引入entityframework,直接可以使用,用到objectset

    note:you can delete reference of entityframework when using this classes.it`s just a simple repohelp ...

  6. Entity Framework 6新功能Logging/Store Procedure

    摘要 在Entity Framework6中有两个新的功能,DB Loggin和Stored Procedure的映射 Entity Framework 6已经从Beta版本来到了RC1版本,我们可以 ...

  7. 《Entity Framework 6 Recipes》翻译系列 (1) -----第一章 开始使用实体框架之历史和框架简述

    微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF ...

  8. 全自动迁移数据库的实现 (Fluent NHibernate, Entity Framework Core)

    在开发涉及到数据库的程序时,常会遇到一开始设计的结构不能满足需求需要再添加新字段或新表的情况,这时就需要进行数据库迁移. 实现数据库迁移有很多种办法,从手动管理各个版本的ddl脚本,到实现自己的mig ...

  9. Entity Framework 教程——概述

    Entity Framework 基础 本教材将手把手教你使用entity framework,我们将使用entity framework 6.0和visual studio 2012. 以下表格是e ...

随机推荐

  1. jpa语句报 org.springframework.dao.InvalidDataAccessApiUsageException: Parameter with that position [2] did not exist; nested exception is java.lang.IllegalArgumentException: Parameter with that position

    @Query("SELECT area from Area AS area WHERE area.state=0 AND area.name like %?1% ")Area fi ...

  2. [canvas]利用canvas绘制自适应的折线图

    前段时间学习了用canvas绘制折现图,且当画布变换大小,折现图会随之变化,现附上代码 <!DOCTYPE html> <html lang="en"> & ...

  3. <二>JDBC_通过ResultSet执行查询操作

    一.ResultSet: 结果集. 封装了使用 JDBC 进行查询的结果.  1. 调用 Statement 对象的 executeQuery(sql) 可以得到结果集. 2. ResultSet 返 ...

  4. 无聊拆中国银行密码器和农业银行U盾

    原始状态 不知从何下手,直接斜口钳暴力剪开 开始露出电路板了,继续拆 拆完是这样的,屏幕没有焊接,直接靠外壳压上去的 背面图 相对而言,农行的就很好拆 后盖很好撬开 前面就是按键,没什么,屏是1286 ...

  5. .net手机号码归属地查询

    调用百度 api http://apistore.baidu.com/apiworks/servicedetail/117.html 贴上代码 using Newtonsoft.Json;using ...

  6. rownum和rowid伪列

    select row employee_id,last name,salary from employees; select row employee_id,last name,salary from ...

  7. 使用rsync同步文件

    rsync是Unix/Linux下同步文件的一个高效算法,它能同步更新两处计算机的文件与目录,并适当利用查找文件中的不同块以减少数据传输.关于rsync的核心算法,有兴趣的看下这篇文章. 这里介绍一下 ...

  8. vim操作

    2.vi的基本操作 a) 进入vi    在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi myfile 不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(comm ...

  9. eclipse护眼颜色和字体大小设置

    ♣eclipse护眼颜色和关键字颜色设置 ♣eclipse字体大小设置(包括jsp , .xml ,.java) 1.Eclipse字体大小调整: 窗口(Window)-首选项(Preferences ...

  10. float导致父级元素塌陷的问题

    利用float进行页面布局时常常会出现父级元素没有高度的塌陷问题,如以下代码: <!DOCTYPE html> <html> <head lang="en&qu ...