zoukankan      html  css  js  c++  java
  • EF各版本增删查改及执行Sql语句

      自从我开始使用Visual Studio 也已经经历了好几个版本了,而且这中间EF等框架的改变也算是比较多的。本篇文章记录下各个版本EF执行Sql语句和直接进行增删查改操作的区别,方便自己随时切换版本。目前我们公司同时在使用VS2010 对应EF4和VS2015 对应EF5和EF6,因为有些老的项目必须得定期更新维护。

    一、新增

    UserList u = new UserList();
    
               u.name=name;
    
               u.age = age;
    
               u.jointime = date;
    
    //添加,这个只是在内存上操作
    
                db.UserList.AddObject(u);
    
                //保存到数据库
    
                db.SaveChanges();

    而在EF5中使用Add

    db.UserList.Add(u );

    二、删除

     

              //需要一个实体对象参数
                    //1,创建要删除的对象
                    //UserList modelDel = new UserList() { ID = id };
                    UserList list = db.UserList.FirstOrDefault(c => c.ID == id);
                    //2,将对象添加到EF管理容器中(没有这步也可以删除)
                    //db.UserList.Attach(list);
                    //3,修改对象的包装类对象标识为删除状态
                    db.UserList.DeleteObject(list);
                    //4,更新到数据库
                    db.SaveChanges();

    而在ef5中使用Remove

    EF.TourList.Remove(model);

    三、修改   update  

      EF中会为每个管理的实体对象创建一个代理包装类对象,其中会跟踪 实体对象 的状态和每个属性的状态;

      3.1 先查询再修改

      通常使用EF更新的方式,先查询出要修改的数据,然后再修改新的值;实体对象被修改的属性 在 代理包装类对象里 的对应属性状态会被修改记录下修改状态,等到调用SaveChanges时,EF会遍历其管理的每个实体对象,并根据其 包装类对象 的状态,生成增删改查sql语句并执行;

          此例中修改操作,会生成 修改的sql语句(注意:此处只为修改过的属性生成sql语句),最后执行。

          缺点:修改先还要查询,难受

    //1.先查询要修改的原数据
    
    Models.BlogArticle modelNew = db.BlogArticles.Where(a => a.AId == model.AId).FirstOrDefault();
    
    //2.设置修改后的值
    
    modelNew.ATitle = "新的数据";
    
    modelNew.AContent = "新的数据~~~~~~";
    
    modelNew.ACate = 12;
    
    //3.跟新到数据库
    
    db.SaveChanges();

      3.2直接修改

      为避免先查询数据库,可以直接将 被修改的实体对象 添加到 EF中管理(此时为附加状态Attached),并手动设置其为未修改状态(Unchanged),同时设置被修改的实体对象的包装类对象 对应属性为修改状态。

      优点:修改前不需要查询数据库。

    EF4中,使用方法

    lover.state = 0;
    
                            lover.id = 4;
    
                            //0.1添加到EF管理容器中,并获取 实体对象 的伪包装类对象
    
                            EF.CreateObjectSet<Love>().Attach(lover);
    
                            EF.ObjectStateManager.ChangeObjectState(lover, EntityState.Modified);
    
                            EF.SaveChanges();
    
                            res = "existAndUpdate";

    这种方法,如果之前查询了这个id的实例对象,那么要释放,使用自己写dispose方法。

    EF5中的使用方法

    //0.0创建修改的 实体对象
    
    Models.BlogArticle model = new BlogArticle();
    
    model.AId = 12;
    
    model.ATitle = "新的数据";
    
    model.AContent = "新的数据~~~~~";
    
    //0.1添加到EF管理容器中,并获取 实体对象 的伪包装类对象
    
    DbEntityEntry<Models.BlogArticle> entry = db.Entry<Models.BlogArticle>(model);
    
    //**如果使用 Entry 附加 实体对象到数据容器中,则需要手动 设置 实体包装类的对象 的 状态为 Unchanged**
    
    //**如果使用 Attach 就不需要这句
    
    entry.State = System.Data.EntityState.Unchanged;
    
    //0.2标识 实体对象 某些属性 已经被修改了
    
    entry.Property("ATitle").IsModified = true;
    
    entry.Property("AContent").IsModified = true;
    
    //3.跟新到数据库
    
    db.SaveChanges();

    四、执行Sql命令

    EF4中使用案例

    //案例1
    
     var peopleViews = db.ExecuteStoreQuery<PersonView>("SELECT PersonID, Name FROM Person");
    
    //案例2
    
    string findTableSql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = '"
    
                                    + templetName+"'";
    
                                //比较怕这个字段在很多表里面都有
    
                                loopTable = db.ExecuteStoreQuery<string>(findTableSql).FirstOrDefault();
    
                                string totalCountSql = "select count(0) from " + loopTable;
    
                                loopNumber = db.ExecuteStoreQuery<int>(totalCountSql).FirstOrDefault();
    View Code

    根据返回值的类型,设置接收容器类型,也可以直接使用VAR

    EF5使用案例

    string sqlString = "select * from VoteDetail where PhoneNumber='" + phoneNumber + "' and VotePicId="
    
                            + id + " and [VoteDate]='" + nowDate + "'";
    
                        //比较怕这个字段在很多表里面都有
    
                        VoteDetail findTable = db.Database.SqlQuery<VoteDetail>(sqlString).FirstOrDefault();
    View Code

    这是比较常用的方法,实际上,是有两种执行方式的。

    EF model first方式, 你的DB是继承ObjectContext

    using (MyObjectContext db = new MyObjectContext() )
    
    {
    
        string sql = “ select columnA, columnB from TableA where 1 = 1 ”;
    
        db.ExecuteStoreQuery<TableAObject>(sql).ToList();//TableAObject就是你定义的对象,对象属性就是columnA, columnB
    
    }
    View Code

     code  first, 你的db是继承DbContext

    using (MyDbContext db = new MyDbContext() )
    
    {
    
        string sql = “ select columnA, columnB from TableA where 1 = 1 ”;
    
        db.TableAObject.SqlQuery(sql).ToList();//TableAObject就是在MyDbContext 定义的对象
    
     }
    View Code

    这里只是列举查询的方式,仅供参考,一般新增 删除 或者修改 用对象的方式比较多,如果是sql,一般是

    db.Database.ExecuteSqlCommand(sqlString)

    这里面说下区别:

    ExecuteSqlCommand与SqlQuery

      在数据上下文DBModel的实例中有个Database属性,其中有两组方法.ExecuteSqlCommand()和.SqlQuery()。它们都可以执行SQL语句,只不过.ExecuteSqlCommand()是不返回结果的,只返回受影响的行数,所以.ExecuteSqlCommand()更适合执行创建、更新、删除操作.SqlQuery()则会返回查询到的结果,并将结果保存在数据实体中,所以更适合执行查询操作

    五、延伸阅读

    http://www.16aspx.com/Article/3525

    分享基于Entity Framework的Repository模式设计源码

     

    http://www.cnblogs.com/JustRun1983/p/3261074.html

    Entity Framework返回IEnumerable还是IQueryable?

     

     

  • 相关阅读:
    CUDA并行算法系列之FFT快速卷积
    CUDA并行算法系列之规约
    混合语言编程:启用CLR(公共语言运行时编译)让C#调用C++
    【CUDA并行程序设计系列(4)】CUDA内存
    【CUDA并行程序设计系列(3)】CUDA线程模型
    【CUDA并行程序设计系列(2)】CUDA简介及CUDA初步编程
    【CUDA并行程序设计系列(1)】GPU技术简介
    关于CUDA的一些学习资料
    MacOS 快捷键技巧
    chrom 自带截屏用法
  • 原文地址:https://www.cnblogs.com/qixinbo/p/7295842.html
Copyright © 2011-2022 走看看