博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MVC学习-用EF做增删改查
阅读量:5018 次
发布时间:2019-06-12

本文共 4791 字,大约阅读时间需要 15 分钟。

在做增删改查先,先介绍几个知识点:

1.代理类

在将对象方法EF数据上下文时,EF会为该对象封装 一个代理类对象,

同时为该对象的每一个属性添加一个标志:unchanged,

当对该对象某个属性进行操作时,该属性就被标志位Modified,同时也将改对象标志给位Modified,

当调用SaveChanges()方法时,根据标志属性,生成相应的sql语句。

2.Attach()添加到代理类中(不推荐使用)

Attach()方法时将一个对象附加到EF上下文中,而Attach()返回的是一个实体类,并不是代理类。

一、几个方法的说明

1.一个是Entry()方法:

public DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class;

可以将 对象保存到 EF数据上下文中

DbEntityEntry有个 属性EntityState,它可以为上下文中的代理对象做标识,并依照标识的值做相应的sql操作

public enum EntityState    {               Detached = 1,             Unchanged = 2,              Added = 4,              Deleted = 8,                Modified = 16,    }

2.还有一个Set()方法

public DbSet<TEntity> Set<TEntity>() where TEntity : class;

//通过public DbSet<TEntity> Set<TEntity>() where TEntity : class;和

//public virtual DbSet<Users> Users { get; set; }知道
//Set<Users>就是Dbset<Users>类型,所以context.Set<Users>()就等价于context.Users

3.操作中几个方法的说明:

SaveChange():EF在SaveChanges的时候,会遍历上下文内容器里的所有实体对象,并检查对象的State 属性,生成相应的SQL语句,在一次性发到数据库中执行

几个知识点:

1.上下文中,主键相同的实体只能被添加一次,否则会抛异常。
因为上下文内部默认实现了,对其中的对象进行了追踪。当A取出数据准备修改Data时;这个时候B可以取出数据Data,但不能修改,因为当前追踪器在A那边,直等到A释放了资源,B才可进行相应的操作。可以通过设置
Entry(t).State=EntityState.Detatched;不进行追踪
2.

 

二、增删改查

1.增

//1.创建一个EF数据上下文对象MyDBEntities context=new MyDBEntities();//2.将要添加的数据,封装成对象 Users user = new Users() {Age = 22, Name = "Kim1"};//3.将改对象放入EF容器中,默认会为该对象加一个封装类对象(代理类对象)//用户对对象的操作,实际上是对代理类的操作 //DbEntityEntry保存着实体状态,当对象被加入时,EF默认为该对象设置State的属性为unchanged DbEntityEntry
entityEntry = context.Entry
(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
(u).State = EntityState.Modified;//3.保存到数据库context.SaveChanges();

3.1批量修改

/// 
/// 批量编辑 数据
/// 
/// 要编辑成 的数据
/// where条件,输入lambda表示式
/// 要修改的 属性名
/// 
修改的条数
public int ModefyBy(Model.Users model, Expression
> whereLambda, params string[] modefiedProNames)
{     //1.查询要修改的数据       List
listModefing = context.Users.Where(whereLambda).ToList(); //获取 实体类 类型对象 Type t = typeof(Model.Users); //获取 实体类 所有的 公共属性 List
proInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public).ToList(); //创建 实体属性 字典集合 Dictionary
dictPros = new Dictionary
(); //将 实体属性 中要修改的属性名 添加到 字典集合中 键:属性名 值:属性对象 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的容器
/// /// 分页查询 /// /// 
要操作的数据类型
/// Where条件语句/// 按什么条件排序 /// 每页都少条数据/// 要查询第几页 ///
返回一个泛型集合
static List
GetPageList
(Func
whereLambda, Func
orderLambda, int pageSize, int pageIndex) where T : class { MyDBEntities context = new MyDBEntities(); var list = context.Set
().Where(whereLambda).OrderBy(orderLambda).Skip((pageIndex - 1) * pageSize).Take(pageSize); return list.ToList(); }

转载于:https://www.cnblogs.com/kimisme/p/4196054.html

你可能感兴趣的文章
WebAPI HelpPage支持area
查看>>
Path元素
查看>>
js学习总结----DOM增删改和应用
查看>>
(20)sopel算法
查看>>
学习总结 javascript 闭包
查看>>
实验吧一个小坑注入
查看>>
【 D3.js 高级系列 — 8.0 】 打标
查看>>
Mac必备软件推荐
查看>>
Android Gson深入分析
查看>>
display:flow-root
查看>>
判读字符串是否为空的全局宏-分享
查看>>
22-reverseString-Leetcode
查看>>
Centos 开机自动联网
查看>>
cocos2dx使用lua和protobuf
查看>>
HDOJ 5630 Rikka with Chess
查看>>
netcore2.1 在后台运行一个任务
查看>>
DOCKER 从入门到放弃(五)
查看>>
Python 多线程学习
查看>>
获取NVIDIA显卡的温度
查看>>
Dijkstra算法
查看>>