Entity Framework初识

来源:互联网 发布:安知非人之谮诉怎么读 编辑:程序博客网 时间:2024/05/18 03:59
一、创建EF:
1、添加新建项=>ADO.NET实体数据模型=>从数据库中生成,选择要连接的数据库;
2、删除‘.tt’为扩展名的文件(两个);
3、点击一下edmx页面的空白处,在属性中‘代码生成策略’设‘为默认值’。
4、生成,在Designer.cs中就有相应代码了。
二、使用EF实现增删查改:
1、linq表达式返回的都是IQueryable类型;
2、linq和lambda及增删改查的代码示例比较:
//创建EF上下文
  UserInformationEntities uie = new UserInformationEntities();
//查询
linq:
  IQueryable<MainInformation> temp = from u in uie.MainInformation
                                             where u.autoId > 6
                                             select u; 
lambda:
  //Where后面泛型约束了u;
           IQueryable<MainInformation> temp = uie.MainInformation.Where<MainInformation>(u => u.autoId > 6);


//查询部分列(想想var是什么类型?)
linq:
            var users = from u in uie.MainInformation
                        select new { u.userName, u.userPassword };
lambda:
            var users = uie.MainInformation.Select(u => new { u.userName, u.userPassword });


//分页查询-->(重点)
lambda:
            var userPage = uie.MainInformation
                //.OrderBy<MainInformation, int>(u => u.autoId);//升序
                .OrderByDescending(u => u.autoId)//降序(泛型约束可省略,下同)
                .Skip(5)//越过5条
                .Take(5)//取5条,即第二页。
       .ToList();//避免延迟加载,使用内存型的集合;


//修改
  var user = temp.FirstOrDefault();
           if (user!=null)
           {
               Console.WriteLine(user.userName);
               user.userName = "伟大的未来";
               uie.SaveChanges();//把所有实体的变化保存回数据库;
            }


//删除
   if (user!=null)
            {
                uie.MainInformation.DeleteObject(user);
                uie.SaveChanges();
            }


//增加
   MainInformation mif = new MainInformation();
            mif.userName = "大神";
            mif.userPassword = "123456";
            uie.MainInformation.AddObject(mif);
            uie.SaveChanges();
总结:1、linq和lambda在编译后的IL代码是一样的,因此效率也一样。
     2、当使用该集合时才去数据库查询(延迟加载),延迟加载每次使用都会去查询数据库,降低性能;使用内存型的 


                集合(List、IEnumable)可以避免延迟加载。
三、EF的性能问题:
1、EF执行的步骤:1、增删改查操作=>上下文管理=>映射(实体->关系)=>底层ADO.NET。
2、本质是帮助生成sql脚本,在数据库层面上依然是执行sql脚本性能没有差别;在应用程序上根据实体的变化,EDMX里面


的ORM映射关系生成sql,此差别可以忽略;所以总体上性能没什么区别。
四、EF上下文管理:
当每次访问都new上下文时,数据库数据会丢失或变得不统一。
解决上下文乱的问题:
1、单例模式:会帮我们缓存实体,随着查询增多内存占用大。
2、使用线程内唯一:每次请求一个新的实例(asp.net,mvc,webform,推荐)。
3、只要用就新建一个实例(不推荐)。
第二种方法的代码实现:
新建一个类,代码如下:
    class GetDbContext
    {
        /// <summary>
        /// 使用线程内上下文唯一的方法
        /// </summary>
        /// <returns></returns>
        public static UserInformationEntities GetCurrentDbContext()
        {
            UserInformationEntities uie = (UserInformationEntities)CallContext.GetData("DbContext");
            if (uie == null)
            {
                uie = new UserInformationEntities();
                CallContext.SetData("DbContext", uie);
            }
            return uie;
        }
    }
调用方法:
UserInformationEntities uie = GetDbContext.GetCurrentDbContext();


原创粉丝点击