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. java并发编程(一)可重入内置锁

    每个Java对象都可以用做一个实现同步的锁,这些锁被称为内置锁或监视器锁.线程在进入同步代码块之前会自动获取锁,并且在退出同步代码块时会自动释放锁.获得内置锁的唯一途径就是进入由这个锁保护的同步代码块 ...

  2. c++聪聪看书(满分代码)

    聪聪是一个善良可爱.睿智聪慧的好孩子.聪聪喜欢看书,这一天她在看一本书时看到了这样一个问题:给你一个正整数n,你要将它分成若干个自然数Ai的和的形式,并且使得这若干个自然数Ai的乘积尽量大,并输出最大 ...

  3. IOS网络第四天 -网络文件上传(0923略)

    01-NSURLSession02-断点续传 02-文件上传01-基本的上传 03-文件上传03-代码封装 04-文件上传04-获得MIMEType.mp4 05-文件的压缩和解压缩.mp4 06-压 ...

  4. Run P4 without P4factory - A Simple Example In Tutorials.

    前言 本文是我运行P4社区于Github开源教程Tutorials中的P4 SIGCOMM 2015 Tutorial一些实战小结,Github链接: Github. 测试的例子:P4 SIGCOMM ...

  5. CACHE COHERENCE AND THE MESI PROTOCOL

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION In contemporary multi ...

  6. [转]Linux学习笔记——例说makefile 头文件查找路径

    0.前言     从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助 ...

  7. Hibernate 异常提示_1

    INFO: HHH000041: Configured SessionFactory: null九月 15, 2016 12:29:35 上午 org.hibernate.engine.jdbc.co ...

  8. redis学习教程地址

    http://www.yiibai.com/redis/redis_quick_guide.html

  9. oracle 解锁

    解决方法如下: 1:查V$DB_OBJECT_CACHE SELECT * FROM V$DB_OBJECT_CACHE WHERE name='CRM_LASTCHGINFO_DAY' AND LO ...

  10. mysql 实战 or、in与union all 的查询效率

    OR.in和union all 查询效率到底哪个快. 网上很多的声音都是说union all 快于 or.in,因为or.in会导致全表扫描,他们给出了很多的实例. 但真的union all真的快于o ...