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 ...
随机推荐
- 无聊拆中国银行密码器和农业银行U盾
原始状态 不知从何下手,直接斜口钳暴力剪开 开始露出电路板了,继续拆 拆完是这样的,屏幕没有焊接,直接靠外壳压上去的 背面图 相对而言,农行的就很好拆 后盖很好撬开 前面就是按键,没什么,屏是1286 ...
- Spring 异常:Error creating bean with name
异常信息:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xxx' 我今 ...
- Android——Toast.makeText()
1.Toast 作用 它是android中一种简单的消息提示框,它没有焦点(即不能被点击),会根据设置的时间自动消失. 2.介绍下Toast的参数 Toast t = Toast.makeText(M ...
- 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏
最近互联网招聘平台拉勾网在五一期间推出个“最难面试的IT公司”代码挑战活动,评选出了5个最难面试的IT公司,即:ThoughtWorks.Google.Unisys.Rackspace.Cypress ...
- Android四大组件--ContentProvider详解(转)
一.相关ContentProvider概念解析: 1.ContentProvider简介在Android官方指出的Android的数据存储方式总共有五种,分别是:Shared Preferences. ...
- 【RabbitMQ】Publish/Subscribe
Publish/Subscribe 在上一节我们创建了一个work queue.背后的设想为每个任务被分发给明确的消费者.这节内容我们将做一些完全不同的事情 -- 我们将发送一条消息给多个消费者.这种 ...
- 点击input时,里面默认字体消失显示
点击input时,点击input里面默认字体消失显示: <input type="" name="" id="" value=&quo ...
- Android Handler机制
http://blog.csdn.net/erliangcode/article/details/52117831
- kafka总结
近期在做kafka metrics. 参考了几个开源的项目,诸如kafka manager, Burrow, kafkaOffsetMonitor,东西都很不错,可惜没有一个是用java编写的,最终自 ...
- 【leedcode】longest-substring-without-repeating-characters
Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...