概述:
使用Entity Framework 4.1 Code First已有一段时间,本文主要总结下学习过程及实用技巧。别人写过的我就直接贴链接上来,最后有几点自己总结的实用技巧。
正文:
学习资源
1. MVC3+EF4.1学习系列
2. Entity Framework 4.1
3. Entity Framework 实体关系总结
4. Building an Entity Framework 4.0 model on views: practical tips
这些都是网友精心总结出来的教程,推荐大家都看看。特别是第一个,是以微软的官方示例为基础,然后加上作者自己的思考写出来文章,写的非常好!
实用技巧
1. 使用SQL Profiler
使用SQL Profiler,可以监测EF生成的SQL语句,包括Update、Delete、Add、Select,很方便地知道自己写的代码最后被.NET翻译成什么样的SQL语句,进而进行优化。这个工具在Sql的企业版里 有,Dev版有没有不是太确定。推荐大家安装这个组件,对分析、使用EF很有帮助。
2. Entity Framework Power Tool
很好用、很酷的一个工具,可以根据你的数据库,生成对应的Code First代码,极大地方便了Code First代码的编写。
该插件可以在VS2010的扩展管理器中下载,输入Entity Framework Power Tool即可搜索到,使用方法,可以参考下面这篇文章:
http://www.cnblogs.com/LingzhiSun/archive/2011/05/24/EFPowerTool_1.html
3. 移除不必要的契约
//防止黑幕交易,要不然每次都会先查询Context对应的数据库存不存在
public TestContext() : base(DbConnManager.SqlConnection, true) { Database.SetInitializer<TestContext>(null); }
//防止黑幕交易,要不然每次都要访问 EdmMetadata这个表
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<IncludeMetadataConvention>(); base.OnModelCreating(modelBuilder); }
这两个契约如非必要,务必要移除,要不你使用SQL Profiler监测下,进行一条简单的查询,EF能执行N多条SQL语句。
4. Entity Framework实现按需更新
在这里再强调一下Entity Framework如何实现按需更新。先给它一个修改前的实体对象,然后修改当前这个对象的属性值,EF才能跟踪所做的修改,并在保存时更新至数据库!
但不能通过context.Entry(entityToUpdate).State = EntityState.Modified;来标记这个对象,否则EF会更新整个实体!
示例:
using (var db = new TestContext()) { var test = db.Tests.FirstOrDefault(row => row.ID == 1); test.Name = "NewName"; test.LastName = "OldValue"; //这个还是该字段原来的值 db.SaveChanges(); }
通过上面的示例最后生成的SQL语句中,只更新了Name字段。由此可知若实体内字段没有重新赋值,或者赋值了还是原来的值即没有更新时,EF是不会生成更新这些字段的SQL的。
实际上我们可以通过下面的代码查询一个实体、属性的更新状态:
Pile pile = _context.Piles.FirstOrDefault(row => row.PileID == 1); //一个实体的状态 EntityState state = _context.Entry(pile).State; //实体中每个字段的状态 bool IsUpdate = _context.Entry<Pile>(pile).Property(p => p.PileName).IsModified; //是否修改 string now = _context.Entry<Pile>(pile).Property(p => p.PileName).CurrentValue; //现在的值 string before = _context.Entry<Pile>(pile).Property(p => p.PileName).OriginalValue; //以前的值
Entity Framework就是通过这些状态来跟踪一个实体有没有更新,并在最后生成相应的SQL语句。
5. Entity Framework无跟踪查询
上面提到的跟踪状态虽然在更新时非常有用,但若数据只是普通的提供给UI展示,则不需要这些跟踪,可以通过以下方法,关闭跟踪:
1. DbSet.SqlQuery 有跟踪状态的查询
2. DbDatabase.SqlQuery 没有跟踪状态的查询
3. DbDatabase.SqlCommand 直接执行SQL语句 一般用来 批量 增删改
4. 在查询时加上asNoTracking(),也可以实现无跟踪查询
6. 其他小技巧
1. 查找一条数据最好用FirstOrDefault方法,生成的sql语句比Find要简单;
2. public string FullName {get{return LastName + ", " + FirstMidName;}}
FullName这个是不会被创建到数据库里的 因为它仅仅是获得 也就是一个get 这样是不会创建一个FullName列 在这个数据库表里的,通过这个可以在DomainModel中添加计算列等;
3. 悲观并发,使用“锁定”来控制,乐观并发,可以在数据库中添加Timestamp来控制;