MVC学习-用EF做增删改查
在做增删改查先,先介绍几个知识点:
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;和 //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 = , 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 = };
//将要删除的对象附加到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 = , 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 - ) * pageSize).Take(pageSize);
return list.ToList();
}
MVC学习-用EF做增删改查的更多相关文章
- ASP.NET从零开始学习EF的增删改查
ASP.NET从零开始学习EF的增删改查 最近辞职了,但是离真正的离职还有一段时间,趁着这段空档期,总想着写些东西,想来想去,也不是很明确到底想写个啥,但是闲着也是够 ...
- easyui datagrid 禁止选中行 EF的增删改查(转载) C# 获取用户IP地址(转载) MVC EF 执行SQL语句(转载) 在EF中执行SQL语句(转载) EF中使用SQL语句或存储过程 .net MVC使用Session验证用户登录 PowerDesigner 参照完整性约束(转载)
easyui datagrid 禁止选中行 没有找到可以直接禁止的属性,但是找到两个间接禁止的方式. 方式一: //onClickRow: function (rowIndex, rowData) ...
- http://www.cnblogs.com/nangong/p/db29669e2c6d72fb3d0da947280aa1ce.htm ASP.NET从零开始学习EF的增删改查
http://www.cnblogs.com/nangong/p/db29669e2c6d72fb3d0da947280aa1ce.htmlASP.NET从零开始学习EF的增删改查
- EF实现增删改查
从来没想到过能在这个上面翻车,感慨自学没有培训来得系统啊,废话不多说 ORM:对象关系映射(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一 ...
- sqlHelper做增删改查,SQL注入处理,存储值,cookie,session
一.存储值 eg:登录一个页面,在进入这个页面之前你怎么知道它登没登录呢?[在登录成功之后我们把状态保存起来] 存储值得方式有两种,一种是cookie,一种是session 1.1区别: 代码: if ...
- java对xml文件做增删改查------摘录
java对xml文件做增删改查 package com.wss; import java.io.File;import java.util.ArrayList;import java.util.Lis ...
- python学习之-成员信息增删改查
python学习之-成员信息增删改查 主要实现了成员信息的增加,修改,查询,和删除功能,写着玩玩,在写的过程中,遇到的问题,旧新成员信息数据的合并,手机号和邮箱的验证,#!/usr/bin/env p ...
- [.NET源码] EF的增删改查
EF的增删改查 创建上下文对象:WordBoradEntities db = new WordBoradEntities(); 一.添加: //1.1创建实体对象 User uObj = new Us ...
- ASP.NET MVC学习---(三)EF简单增删改查
那么现在我们已经大概从本质上了解了ef 巴拉巴拉说了一大堆之后 总算要进入ef的正题了 总在口头说也太不行了是吧~ 没错,现在要用ef进行一些实际的操作 做什么呢? 就做一个入门级的增删改查操作吧 废 ...
随机推荐
- [HDU5709]Claris Loves Painting(动态开点线段树+合并)
题意:有n(<=1e5)个点的树,每个点都有颜色(颜色可能重复),有m(<=1e5)个询问,每次询问(x,d)问在x的子树中,与x的距离不超过d的节点有多少种不同的颜色.强制要求在线. 分 ...
- JAVA配置--JDK环境变量配置
环境变量是整台电脑的全局变量,(这台电脑上)任何程序都可以读取这个变量. 如果您安装好jdk,但环境变量配置让你感到有一点模糊的话,那么请您看一下这篇,希望对您有帮助 根据打开电脑的属性(R),出现 ...
- SecurityContextHolder.getContext().getAuthentication()为null的情况
原理: UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication() . ...
- 携程Apollo(阿波罗)配置中心本地开发模式不接入配置中心进行本地开发
官方教程:https://github.com/ctripcorp/apollo/wiki/Java%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BD%BF%E7%94%A8%E6%8 ...
- seajs入门使用
使用 Sea.js 进行模块化开发还能够带来非常多优点: 模块的版本号管理. 通过别名等配置,配合构建工具,能够比較轻松地实现模块的版本号管理. 提高可维护性.模块化能够让每一个文件的职责单一,很有利 ...
- hdu oj 3127 WHUgirls(2009 Asia Wuhan Regional Contest Online)
WHUgirls Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total ...
- openstack-glance-api.service start request repeated too quickly, refusing to start
问题描写叙述 openstack J版 centos7部署 重新启动服务时起不来,日志也不报错.以glance服务为例,例如以下: # systemctl start openstack-glance ...
- 简单区分iphone和ipad的宏定义
在公共头文件里作例如以下定义: #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 使用时: if( IS_I ...
- 关于微软网站维护培训时遇到的issues:What is WEDCS?
WEDCS (pronounced “wed-ex”), the Web Events Data Collection Service, is a system for collecting, com ...
- HDU5806 NanoApe Loves Sequence Ⅱ
NanoApe Loves Sequence Ⅱ Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/131072 K (Ja ...