删除操作
方法1,使用sql方式删除
这种方法比较简单,直接使用EF模型的实体执行Database.ExecuteSqlCommand命令即可,而且貌似也不用查询,直接让实体执行操作数据库的命令即可,效率也快一点儿,虽然简单,不过这种写法一点都不洋气,还是得看下面几种先进的方法。
//实例化对象模型的实例
FHZMEntities fHZMEntities = new FHZMEntities();
//根据sql语句来删除数据
int count = fHZMEntities.Database.ExecuteSqlCommand("delete from UserInfo where Id=@Id", new SqlParameter("@Id", userInfoId));
方法2,先查询再删除
这种方法会查询一遍数据库,也就是能知道数据库里是否有要删除的纪录,再把查询到的数据调用实体来向数据库执行删除操作。这种写法使用了lamdba表达式,也就是匿名函数,比写SQL语句方便,只是它会查询数据库,效率比直接用实体操作数据库稍微慢一点点。
//实例化实体
FHZMEntities FHZMEntities = new FHZMEntities();
//先查询出此条信息
UserInfo userInfo = FHZMEntities.UserInfo.Where(a => a.Id == userInfoId).FirstOrDefault();
//判断此用户信息是否存在,进入这个判断表示用户是通过非正常流程提交的,因为数据库里的数据对应着前台的数据,
//而且是通过post提交的,只有数据库里没有该数据时才会为空,不用友好提示,因为这是恶意提交的
if (userInfo == null)
{
return Content("该信息不存在,勿非法提交");
}
//将状态添加到实体中
FHZMEntities.UserInfo.Remove(userInfo);
//把修改请求提交到数据库
int count = FHZMEntities.SaveChanges();
使用这种方法想要查询出多个用户对象,然后一次删除也是可以做到的,只需要在实体调用操作数据库的方法之前将这些多个用户对象都添加到实体的状态即可,如下图就是在实体执行操作数据库的方法之前将多个查出来的用户对象都添加到实体的状态里,然后调用一次操作数据库的方法即可:
也可以像下图一样,像实体中添加一个状态就让实体执行一次操作数据库的方法,这样就能更实时的删除了,只不过这样效率要慢些:
删除方法3:直接删除,不用查询
这种方法效率比上一种方法快,因为它不查询,而是直接用实体操作数据库
//实例化实体
FHZMEntities FHZMEntities = new FHZMEntities();
//从实体里实例化对象信息,可以实例化多个对象,并把这些对象都通过下面两种方式添加到实体的状态中
UserInfo userInfoToDelete = new UserInfo() { Id = (int)userInfoId };
////修改状态方式1
////给实体添加一个修改状态,这种写法不用调用Remove将状态添加到实体中,因为它内部也是调用了Remove方法
//FHZMEntities.Entry(userInfoToDelete).State=System.Data.EntityState.Deleted;
//修改状态方式2:先借助Attch方法把新对象放入上下文对象中,在通过Remow将状态添加到实体中,这种方式貌似不能添加修改状态
//给实体添加一个删除状态,
FHZMEntities.UserInfo.Attach(userInfoToDelete);
////将状态添加到实体中
FHZMEntities.UserInfo.Remove(userInfoToDelete);//Remove是将状态改为删除并将状态添加到实体,前提是对象必须给上下文跟踪
//把修改请求提交到数据库(使用这种方法可以批量删除,就是给实体添加多个修改状态,然后提交)
int count = FHZMEntities.SaveChanges();
这种方法有两种把对象添加到实体状态里的上下文的方法,在上面代码中也写了的。
第一种:
这种貌似只能让实体执行删除操作的时候用,具体暂时不知道是不是这样,暂时先这样总结。
//修改状态方式2:先借助Attch方法把新对象放入上下文对象中,在通过Remow将状态添加到实体中,这种方式貌似不能添加修改状态
//给实体添加一个删除状态,
FHZMEntities.UserInfo.Attach(userInfoToDelete);
////将状态添加到实体中
FHZMEntities.UserInfo.Remove(userInfoToDelete);//Remove是将状态改为删除并将状态添加到实体,前提是对象必须给上下文跟踪
第二种
这种本质上也是利用了第一种方法,就像是第一种的简写一样,不过这样写能直接指定实体执行删除或者修改等操作。
//修改状态方式2
//给实体添加一个修改状态,这种写法不用调用Remove将状态添加到实体中,直接在后面写Deleted状态即可,因为它内部也是调用了Remove方法
FHZMEntities.Entry(userInfoToDelete).State = System.Data.EntityState.Deleted;
练习:
如上图:选择多个用户信息后,点击删除,实现批量删除,思路:
拿到要被删除的所有行,也就是要被删除的所有用户,把用户的id全部用字符串拼接好,最后将这个字符串传到控制器,控制器解析后调用EF删除即可。
第一步:拿到表格里所有别选中的行的id,然后定义一个字符串来接受选中的id,累加到字符串中,逗号隔开。
第二步,传到控制器里,什么方式传也行,Location.herf也行,这里我们用的异步,ajax来传需要删除的id,
第三步,后台控制器解析并使用EF调用即可。
最后,使用ajax的话,只需要在回调函数里用js来将前台表格里的行删除即可,不用异步的话直接在控制器的最后重新访问这个页面的控制器即可。