Entity Framework7 有哪些不同?之具体功能
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 有哪些不同?之具体功能的更多相关文章
- Entity Framework7 入门之全功能.NET版本下使用EF7(含源码)另附数据迁移常见错误处理
Entity Framework7 入门之全功能.NET(Console, WinForms, WPF等)使用EF7 昨天,我们介绍了EF的新特性和开发计划,如果你还不了解,请移步 Entity Fr ...
- Entity Framework7 入门之全功能.NET(Console, WinForms, WPF等)使用EF7
昨天,我们介绍了EF的新特性和开发计划,如果你还不了解,请移步 Entity Framework7 有哪些不同?现在开发到什么程度了? .今天,我们开学习全功能.NET(Full .NET)下使用EF ...
- Entity Framework7 有哪些不同?现在开发到什么程度了?
Entity Framework7之开篇 一.Entity Framework7 简介 Entity Framework7简称EF7,是微软正在开发的最新的在.NET应用中首选的数据访问技术.它是轻量 ...
- 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. ...
- 写一个system.data.entity的simpledatarepo,实现crudq这些功能,不需要引入entityframework,直接可以使用,用到objectset
note:you can delete reference of entityframework when using this classes.it`s just a simple repohelp ...
- Entity Framework 6新功能Logging/Store Procedure
摘要 在Entity Framework6中有两个新的功能,DB Loggin和Stored Procedure的映射 Entity Framework 6已经从Beta版本来到了RC1版本,我们可以 ...
- 《Entity Framework 6 Recipes》翻译系列 (1) -----第一章 开始使用实体框架之历史和框架简述
微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF ...
- 全自动迁移数据库的实现 (Fluent NHibernate, Entity Framework Core)
在开发涉及到数据库的程序时,常会遇到一开始设计的结构不能满足需求需要再添加新字段或新表的情况,这时就需要进行数据库迁移. 实现数据库迁移有很多种办法,从手动管理各个版本的ddl脚本,到实现自己的mig ...
- Entity Framework 教程——概述
Entity Framework 基础 本教材将手把手教你使用entity framework,我们将使用entity framework 6.0和visual studio 2012. 以下表格是e ...
随机推荐
- 【转】【Raspberry Pi】Unix NetWork Programming:配置unp.h头文件环境
一.初衷 近期正在做网络计算编程的作业.要求平台为unix/linux,想着Raspberry Pi装的Debian系统也是Linux改的,也应该能够勉强用着,所以就用它来做作业了! 二.说明 先把环 ...
- 撑100s小游戏
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> <met ...
- Heartbeat+DRBD+MySQL高可用方案
1.方案简介 本方案采用Heartbeat双机热备软件来保证数据库的高稳定性和连续性,数据的一致性由DRBD这个工具来保证.默认情况下只有一台mysql在工作,当主mysql服务器出现问题后,系统将自 ...
- fenye
<div class="ptb20 navpages"> <span class=" ">共有<span class=" ...
- nodejs如何储存一个GBK编码的文件
思路:utf-8 -> decode(to buffer) -> convert to gbk(buffer also) -> write buffer to file. var f ...
- spring接收json格式的多个对象参数(变通法)
两种方法 方法1 如果使用spring mvc同客户端通信,完全使用json数据格式,需要如下定义一个RequestMapping @Controller public class TestContr ...
- mysql 锁-比较详细、深入的介绍
详见:http://www.cnblogs.com/chenpingzhao/archive/2015/12/13/5041967.html
- C# 构造post参数一种看起来直观点的方法[转]
因为本人经常爱用C#做一些爬虫类的小东西,每次构造post参数的时候,都是直接字符串拼接的方式的,有时候改起来不太方便. 场景: 需要post一个地址 参数列表 : username:管理员 pass ...
- 老司机带你走进Core Animation
为什么时隔这么久我又回来了呢? 回来圈粉. 开玩笑的,前段时间ipv6被拒啊,超级悲剧的,前后弄了好久,然后需求啊什么的又超多,所以写好的东西也没有时间整理.不过既然我现在回来了,那么这将是一个井喷的 ...
- "mkimage" command not found - U-Boot images will not be built
编译内核的时候出现错误:"mkimage" command not found - U-Boot images will not be built 参考链接 http://blog ...