Entity Framework学习三:查询、插入、更新和删除操作
2015-09-20 17:52
489 查看
1.LINQ过滤数据
两种不同的写法,效果一样。
多条件组合查找
对查找结果排序升序:
对查找结果排序降序:
延迟加载和贪婪加载(Lazy Loading和eager loading)
如果不确定是否要加载关联数据时就使用延迟加载,否则就使用贪婪加载。当然这个不是固定的看具体什么场景下使用。默认情况下延迟加载是生效的,可以在创建DbContex后配置选项
2.插入数据
多种方法,不多说看代码:
方法一
方法二:改变Entity的状态
EntityState:Added、Deleted、Detached(DbContex不追踪Entity状态)、Modified、Unchanged
3.更新数据
多种方法:
方法一:
方法二(建议使用)注意标记部分:
你会发现执行上面代码只有Person数据更新了,Phone数据没有更新,这是因为Insert和Update机制不一样,Update时设置了Entity的EntityState,但是并没有传播到子数据的状态,需要都上面程序做些修改
在开发Web程序时可以使用AsNoTracking来提高查询性能
使用Attach 会改变状态为Unchanged,并开始追踪Entity的状态
上面代码执行将仅仅只会更新LastName列。也可以用以下代码替代Attach方法
4.删除数据
方法一:先查询出数据,再删除(注意删除子数据可以使用设置数据库级联删除更方便)
方法二:使用改变状态
5.查询本地数据
当需要查询的数据已经在内存中,而未提交到数据库时对内存数据进行查询
var query = from person in context.People where person.FirstName.StartsWith("a") select person; var methodQuery = context.People.Where(p => p.FirstName.StartsWith("a"));
两种不同的写法,效果一样。
多条件组合查找
var query = from person in context.People where 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.People where person.FirstName.StartsWith("a") && person.LastName.EndsWith("b") orderby person.FirstName,person.LastName select 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.People where person.FirstName.StartsWith("a") && person.LastName.EndsWith("b") orderby person.FirstName,person.LastName descending select 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();
相关文章推荐
- Java的虚拟机存储 堆栈与GC概要
- IOS开发之免费证书+不越狱真机调试
- [C#基础] 类
- Eclipse环境下通过C语言连接MySQL数据库方法
- 简易通讯录
- word2vec源码详细赏析(一)
- mysql-5.6.16-winx64 配置详解
- 在linux系统上编写的第一个程序
- 设计模式——六大原则
- mysql字段插入中文乱码
- SQL语句
- 9.14-9.18随笔之一(CSS扩展技术:LESS SASS)
- jdk源码调试功能
- Git初用心得
- 【IOS 开发学习总结-OC-9】★ objective-c面向对象之——方法
- 对JSONObject中的数据进行排序
- 2015年ACM北京网络赛 B题 (模拟+枚举题意请原谅我英语不好。。。)
- 分布式的基本概念
- servlet+mysql实现简单报表显示
- 1045. 快速排序(25)