1.增
//1.创建一个EF数据上下文对象 MyDBEntities context=new MyDBEntities(); //2.将要添加的数据,封装成对象 Users user = new Users() {Age = 22, Name = "Kim1"}; //3.将改对象放入EF容器中,默认会为该对象加一个封装类对象(代理类对象) //用户对对象的操作,实际上是对代理类的操作 //DbEntityEntry保存着实体状态,当对象被加入时,EF默认为该对象设置State的属性为unchanged DbEntityEntry<Users> entityEntry = context.Entry<Users>(user); //4.设置对象的标志位Added entityEntry.State=EntityState.Added; //5.当调用SaveChanges()时,EF会遍历所有的代理类对象,并根据标志生成相应的sql语句 context.SaveChanges(); Console.WriteLine("添加成功");
2.删
2.1根据Id(表的主键)删除
MyDBEntities context=new MyDBEntities(); Users user = new Users() {Id = 8}; //将要删除的对象附加到EF容器中 context.Users.Attach(user); //Remove()起到了标记当前对象为删除状态,可以删除 context.Users.Remove(user); context.SaveChanges(); Console.WriteLine("删除成功");
2.2根据非主键删除
//1.要删除的条件,这里是要删除name为Kim的项 string name = "Kim"; //2.获得name为Kim的对象 var s1 = from s in context.Users where s.Name==name select s; //3.如果有多个的话就用foreach()遍历,这里就删除第一个 context.Users.Remove(s1.FirstOrDefault()); //4.保存到数据库 context.SaveChanges();
3.改
//1.获得要更新后的数据,在mvc中的Action方法,可直接获得 更新后的对象 Users u = new Users() { Id = 4, Name = "kim" }; //2.标识为修改 context.Entry<Users>(u).State = EntityState.Modified; //3.保存到数据库 context.SaveChanges();
3.1批量修改
/// <summary> /// 批量编辑 数据 /// </summary> /// <param name="model">要编辑成 的数据</param> /// <param name="whereLambda">where条件,输入lambda表示式</param> /// <param name="modefiedProNames">要修改的 属性名</param> /// <returns>修改的条数</returns> public int ModefyBy(Model.Users model, Expression<Func<Model.Users, bool>> whereLambda, params string[] modefiedProNames) { //1.查询要修改的数据 List<Model.Users> listModefing = context.Users.Where(whereLambda).ToList(); //获取 实体类 类型对象 Type t = typeof(Model.Users); //获取 实体类 所有的 公共属性 List<PropertyInfo> proInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public).ToList(); //创建 实体属性 字典集合 Dictionary<string, PropertyInfo> dictPros = new Dictionary<string, PropertyInfo>(); //将 实体属性 中要修改的属性名 添加到 字典集合中 键:属性名 值:属性对象 proInfos.ForEach(p => { if (modefiedProNames.Contains(p.Name)) { dictPros.Add(p.Name, p); } }); //循环 要修改的属性名 foreach (string proName in modefiedProNames) { //判断 要修改的属性名是否在 实体类的属性集合中存在 if (dictPros.ContainsKey(proName)) { //如果存在,则取出要修改的 属性对象 PropertyInfo proInfo = dictPros[proName]; //取出 要修改的值 object newValue = proInfo.GetValue(model); //批量设置 要修改 对象的 属性 foreach (Users user in listModefing) { //为 要修改的对象 的 要修改的属性 设置新的值 proInfo.SetValue(user, newValue); } } } //一次性 生成sql语句到数据库执行 return context.SaveChanges(); }
4.查
4.1普通查
//查询Name为Kim的全部数据 var s = context.Users.Where(u => u.Name == "Kim").Select(u => u);
4.2分页查
注意:分页查询的时候,一定要先排序,因为其内部是做了一个row_number()的操作。
Func<T,bool>是Expression<Func<T,bool>>的缩小,Expression可以理解为就是Lambda的容器
/// <summary> /// 分页查询 /// </summary> /// <typeparam name="T">要操作的数据类型</typeparam> /// <param name="whereLambda">Where条件语句</param> /// <param name="orderLambda">按什么条件排序</param> /// <param name="pageSize">每页都少条数据</param> /// <param name="pageIndex">要查询第几页</param> /// <returns>返回一个泛型集合</returns> static List<T> GetPageList<T>(Func<T, bool> whereLambda, Func<T, object> orderLambda, int pageSize, int pageIndex) where T : class { MyDBEntities context = new MyDBEntities(); var list = context.Set<T>().Where(whereLambda).OrderBy(orderLambda).Skip((pageIndex - 1) * pageSize).Take(pageSize); return list.ToList(); }
一、什么是EF?
ADO.NETEntity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案。ADO.NET Entity Framework 以 Entity DataModel (EDM) 为主,将数据逻 辑层切分为三块,分别为 Conceptual Schema, Mapping Schema 与 Storage Schema 三层,其上还有Entity Client,Object Context 以及 LINQ 可以使用。
EF的运作流程:
二、如何创建EF:
右击项目——添加——新建项——数据(C#)——选择ADO.NET实体数据模型——点击添加——然后根据实体数据模型向导来一步步的做。
三、实现增删改查功能
方法一
在DAL层写下增删改查操作的代码
一、什么是EF? ADO.NETEntity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案。ADO.NET Entity Framework 以 Entity DataModel (EDM) 为主,将数据逻 辑层切分为三块,分别为 Conceptual Schema, Mapping Schema 与 Storage Schema 三层,其上还有Entity Client,Object Context 以及 LINQ 可以使用。 EF的运作流程: 二、如何创建EF: 右击项目——添加——新建项——数据(C#)——选择ADO.NET实体数据模型——点击添加——然后根据实体数据模型向导来一步步的做。 三、实现增删改查功能 方法一 在DAL层写下增删改查操作的代码 [csharp] view plain copy <pre name="code" class="csharp"> //EF查询 public userinfo GetUser(string username) { using (MyShopDBEntities1 entity = new MyShopDBEntities1()) { userinfo user = entity.userinfo.SingleOrDefault(model => model.username == username); return user; } } //修改 public userinfo Update(string username,string userpwd) { using (MyShopDBEntities1 entity = new MyShopDBEntities1()) { // userinfo user = entity.userinfo.SingleOrDefault(model => model.username == username); userinfo user = entity.userinfo.FirstOrDefault(model => model.username == username); if (user != null) { user.userpassword=userpwd; entity.SaveChanges(); } return user; } } //添加 public userinfo Add(userinfo user) { using (MyShopDBEntities1 entity = new MyShopDBEntities1()) { entity.userinfo.Add( new userinfo() { username = user.username, userpwd = user.userpwd }); if (entity.SaveChanges() > 0) { return user; } else return null; } } //删除 public void Deleted(string username) { using (MyShopDBEntities1 entity = new MyShopDBEntities1()) { userinfo user = entity.userinfo.FirstOrDefault(m => m.username == username); if (user != null) { entity.userinfo.Remove(user); } if (entity.SaveChanges() > 0) { //return 0; } } } 方法二: [csharp] view plain copy EF4.0和EF5.0增删改查的写法区别及执行Sql的方法 EF4.0和EF5.0增删改查的写法区别 public T AddEntity(T entity) { //EF4.0的写法 添加实体 //db.CreateObjectSet<T>().AddObject(entity); //EF5.0的写法 db.Entry<T>(entity).State = EntityState.Added; //下面的写法统一 db.SaveChanges(); return entity; } public bool UpdateEntity(T entity) { //EF4.0的写法 //db.CreateObjectSet<T>().Addach(entity); //db.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified); //EF5.0的写法 db.Set<T>().Attach(entity); db.Entry<T>(entity).State = EntityState.Modified; return db.SaveChanges() > 0; } public bool DeleteEntity(T entity) { //EF4.0的写法 //db.CreateObjectSet<T>().Addach(entity); //db.ObjectStateManager.ChangeObjectState(entity, EntityState.Deleted); //EF5.0的写法 db.Set<T>().Attach(entity); db.Entry<T>(entity).State = EntityState.Deleted; return db.SaveChanges() > 0; } public IQueryable<T> LoadEntities(Func<T, bool> whereLambda) { //EF4.0的写法 //return db.CreateObjectSet<T>().Where<T>(whereLambda).AsQueryable(); //EF5.0的写法 return db.Set<T>().Where<T>(whereLambda).AsQueryable(); } 执行SQL语句 //EF4.0的写法 //int ExcuteSql(string strSql, ObjectParameter[] parameters); return EFContextFactory.GetCurrentDbContext().ExecuteFunction(strSql, parameters); //EF5.0的写法 int ExcuteSql(string strSql, DbParameter[] parameters); return DEFContextFactory.GetCurrentDbContext().ExecuteSqlCommand(strSql, parameters); 注:增删改操作必须使用entity.SaveChanges()进行保存一下。entity.SaveChanges()返回值为数据库里受影响的行数entity.SaveChanges()>0表示操作成功。如entity.SaveChanges()=0则表示操作失败。
方法二:
注:增删改操作必须使用entity.SaveChanges()进行保存一下。entity.SaveChanges()返回值为数据库里受影响的行数entity.SaveChanges()>0表示操作成功。如entity.SaveChanges()=0则表示操作失败。