zoukankan      html  css  js  c++  java
  • Entity Framework 4.1 学习记录

    概述:

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


    作者:Xiongpq
    出处:http://xiongpq.cnblogs.com/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    HDU——1061Rightmost Digit(高次方,找规律)
    HDU——1019Least Common Multiple(多个数的最小公倍数)
    HDU——1013Digital Roots(九余数定理)
    HDU——1020Encoding(水题,string过)
    HDU——2093考试排名(string类及其函数的运用以及istringstream)
    廖雪峰Java3异常处理-2断言和日志-4使用Log4j
    廖雪峰Java3异常处理-2断言和日志-3使用Commons Logging
    廖雪峰Java3异常处理-2断言和日志-2使用JDK Logging
    廖雪峰Java3异常处理-2断言和日志-1使用断言
    Charles问题
  • 原文地址:https://www.cnblogs.com/xiongpq/p/2268376.html
Copyright © 2011-2022 走看看