Entity Framework学习三:查询、插入、更新和删除操作
1.LINQ过滤数据
var query = from person in context.Peoplewhere person.FirstName.StartsWith("a")select person; var methodQuery = context.People.Where(p => p.FirstName.StartsWith("a"));
两种不同的写法,效果一样。
- 多条件组合查找
var query = from person in context.Peoplewhere person.FirstName.StartsWith("a") &&person.LastName.EndsWith("b")select person; var methodQuery = context.People.Where(p => p.FirstName.StartsWith("a") && p.LastName.EndsWith("b"));
- 对查找结果排序升序:
var query = from person in context.Peoplewhere person.FirstName.StartsWith("a") &&person.LastName.EndsWith("b")orderby person.FirstName,person.LastNameselect person;var methodQuery = context.People.Where(p => p.FirstName.StartsWith("a") && p.LastName.EndsWith("b")).OrderBy(p => p.FirstName).ThenBy(p => p.LastName);
- 对查找结果排序降序:
var query = from person in context.Peoplewhere person.FirstName.StartsWith("a") &&person.LastName.EndsWith("b")orderby person.FirstName,person.LastNamedescendingselect person;var methodQuery = context.People.Where(p => p.FirstName.StartsWith("a") && p.LastName.EndsWith("b")).OrderByDescending(p => p.FirstName).ThenByDescending(p => p.LastName);
- 延迟加载和贪婪加载(Lazy Loading和eager loading)
如果不确定是否要加载关联数据时就使用延迟加载,否则就使用贪婪加载。当然这个不是固定的看具体什么场景下使用。默认情况下延迟加载是生效的,可以在创建DbContex后配置选项
context.Configuration.LazyLoadingEnabled = false;
2.插入数据
多种方法,不多说看代码:
- 方法一
var person = new Person { BirthDate = new DateTime(1980, 1, 2), FirstName = "John", HeightInFeet = 6.1M, IsActive = true, LastName = "Doe", MiddleName = "M" }; person.Phones.Add(new Phone { PhoneNumber = "1-222-333-4444" }); person.Phones.Add(new Phone { PhoneNumber = "1-333-4444-5555" }); using (var context = new Context()) { context.People.Add(person); context.SaveChanges(); }
方法二:改变Entity的状态
using (var context = new Context()) { context.Entry(person2).State = EntityState.Added; context.SaveChanges(); }
EntityState:Added、Deleted、Detached(DbContex不追踪Entity状态)、Modified、Unchanged
3.更新数据
多种方法:
方法一:
using (var context = new Context()) { var person = context.People.Find(1); person.FirstName = "New Name"; context.SaveChanges(); }
方法二(建议使用)注意标记部分:
var person2 = new Person { PersonId = 1, BirthDate = new DateTime(1980, 1, 2), FirstName = "Jonathan", HeightInFeet = 6.1m, IsActive = true, LastName = "Smith", MiddleName = "M" }; person2.Phones.Add(new Phone { PhoneNumber = "updated 1", PhoneId = 1, PersonId = 1 }); person2.Phones.Add(new Phone { PhoneNumber = "updated 2", PhoneId = 2, PersonId = 1 }); using (var context = new Context()) { context.Entry(person2).State = EntityState.Modified; context.SaveChanges(); }
你会发现执行上面代码只有Person数据更新了,Phone数据没有更新,这是因为Insert和Update机制不一样,Update时设置了Entity的EntityState,但是并没有传播到子数据的状态,需要都上面程序做些修改
using (var context = new Context()) { context.Entry(person2).State = EntityState.Modified; foreach (var phone in person2.Phones) { context.Entry(phone).State = EntityState.Modified; } context.SaveChanges(); }
在开发Web程序时可以使用AsNoTracking来提高查询性能
using (var context = new Context()) { var query = context.People.Include(p => p.Phones).AsNoTracking(); foreach (var person in query) { foreach (var phone in person.Phones) { } } }
- 使用Attach 会改变状态为Unchanged,并开始追踪Entity的状态
var person3 = new Person { PersonId = 1, BirthDate = new DateTime(1980, 1, 2), FirstName = "Jonathan", HeightInFeet = 6.1m, IsActive = true, LastName = "Smith", MiddleName = "M" }; using (var context = new Context()) { context.People.Attach(person3); person3.LastName = "Updated"; context.SaveChanges(); }
上面代码执行将仅仅只会更新LastName列。也可以用以下代码替代Attach方法
context.Entry(person3).State = EntityState.Unchanged
4.删除数据
- 方法一:先查询出数据,再删除(注意删除子数据可以使用设置数据库级联删除更方便)
using (var context = new Context()) { var toDelete = context.People.Find(personId); toDelete.Phones.ToList().ForEach(phone =>context.Phones.Remove(phone)); context.People.Remove(toDelete); context.SaveChanges(); }
- 方法二:使用改变状态
var toDeleteByState = new Person { PersonId = personId }; toDeleteByState.Phones.Add(new Phone { PhoneId = phoneId1, PersonId = personId }); toDeleteByState.Phones.Add(new Phone { PhoneId = phoneId2, PersonId = personId }); using (var context = new Context()) { context.People.Attach(toDeleteByState); foreach (var phone in toDeleteByState.Phones.ToList()){context.Entry(phone).State = EntityState.Deleted;}context.Entry(toDeleteByState).State = EntityState.Deleted;context.SaveChanges(); }
5.查询本地数据
当需要查询的数据已经在内存中,而未提交到数据库时对内存数据进行查询
var localQuery = context.People.Local.Where(p => p.LastName.Contains("o")).ToList();
转载于:https://www.cnblogs.com/zjmsky/p/4823847.html
Entity Framework学习三:查询、插入、更新和删除操作相关推荐
- python查询mysql数据库_python针对mysql数据库的连接、查询、更新、删除操作示例...
本文实例讲述了python针对mysql数据库的连接.查询.更新.删除操作.分享给大家供大家参考,具体如下: 连接 一 代码 import pymysql # 打开数据库连接 db = pymysql ...
- 关于Entity Framework自动关联查询与自动关联更新导航属性对应的实体注意事项说明...
一.首先了解下Entity Framework 自动关联查询: Entity Framework 自动关联查询,有三种方法:Lazy Loading(延迟加载),Eager Loading(预先加载) ...
- Entity Framework 学习
Entity Framework 学习初级篇1--EF基本概况... 2 Entity Framework 学习初级篇2--ObjectContext.ObjectQuery.ObjectStateE ...
- Entity Framework学习中级篇
1-EF支持复杂类型的实现 本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的简单操作. 通常,复杂类型是指那些由几个简单的类型组合而成的类型.比如:一张Customer表,其中 ...
- Entity Framework 学习中级篇—EF支持复杂类型的实现
http://www.cnblogs.com/xray2005/archive/2009/06/01/1493661.html 本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的 ...
- Entity Framework 学习中级篇1—EF支持复杂类型的实现
本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的简单操作. 通常,复杂类型是指那些由几个简单的类型组合而成的类型.比如:一张Customer表,其中有FristName和Las ...
- Entity Framework 学习建议及自学资源
Entity Framework 学习建议及教学PPT 金旭亮 =============================================== EntityFramework(EF)是 ...
- entity framework学习笔记
学习ef首先要介绍一些基本的概念. 1,概念模型: 就是讲世界上具体的事物抽象为某一种信息结构,这种结构并不依赖于某种计算机,不是某种数据库 支持的数据模型,而是一种概念性的模型.如下图 2,ef的实 ...
- mysql插入第一_mySQL教程 第5章 插入 更新与删除数据
第5章 插入 更新与删除数据 使用SQL Manager管理工具连接到schoolDB.由于三张表都设置了主键,因此,以下练习中插入的记录,主键不能重. 插入数据 1. 练习:为表的所有字段插入数据 ...
最新文章
- SmartImageView框架的使用
- 奥托尼克斯接近开关型号_12月23日NBA | 骑士VS老鹰、尼克斯VS奇才、开拓者VS鹈鹕...
- 易语言python1.1模块_易语言之编写模块与引入模块
- java分割两个时间段不在同月份
- 解决编译错误: 非法字符: '\ufeff' 解决方案|错误: 需要class, interface或enum
- http请求,普通的get和post方法
- 微擎不现实数组_Java这个类,大概就和现实中吃饭一样常见
- 【HDU 5869】Different GCD Subarray Query【区间不同 gcd 个数】
- [转]C#反射,根据反射将数据库查询数据和实体类绑定,并未实体类赋值
- visio2003 反向工程链接 mssql2005
- 学习WEB的心理路程
- 百度提交网站提示您无权访问该页面,点击确定按钮返回首页,如何解决
- 实验8 OpenGL太阳系动画
- c语言if后面的表达式是什么类型,if语句后面的表达式应该是什么?
- 如果一个人没有明确的目标,他的人生就像是一艘没有罗盘的船
- C/C++项目开发:《火柴人游戏》,500行源代码开发
- 极简烟雨图床正式版源码V2.1.3/高速外链图床
- 用exec()函数执行新程序
- 基于springboot实现学校线上教学平台管理系统【源码+论文】分享
- MyCat 的入门和放弃
热门文章
- node sqlite 插入数据_安卓手机中的应用数据都保存在哪些文件中?
- Linux数组计算平均值,从数组中读取并计算平均值
- java双目运算符重载,c++类的单目和双目运算符的重定义
- python 工业自动化 人工智能_Python人工智能之路 - 第三篇 : PyAudio 实现录音 自动化交互实现问答...
- 窗帘效果图css,vuejs、微信小程序窗帘效果
- JAVA求是否为闰年,for-while循环,输出你好
- OpenCV(十二)漫水填充算法
- php字符串数组访问,php – 按字符串键x访问数组,其中x是“123”
- 查找计算机 域服务不可用,win7系统打印文件提示Active Directory域服务不可用解决方法...
- git 打tag_图文讲解,团队开发中的 Git 最佳实践