现在的位置: 首页 > 综合 > 正文

Entity Framework 4.1 学习记录

2012年06月22日 ⁄ 综合 ⁄ 共 2419字 ⁄ 字号 评论关闭
文章目录

概述:

使用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来控制;

【上篇】
【下篇】

抱歉!评论已关闭.