C# EF增删改查

时间:2023-03-08 18:09:01
C# EF增删改查

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的运作流程:

C# EF增删改查

二、如何创建EF:

右击项目——添加——新建项——数据(C#)——选择ADO.NET实体数据模型——点击添加——然后根据实体数据模型向导来一步步的做。

C# EF增删改查

三、实现增删改查功能

方法一

  在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() > )
{
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() > )
{
//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() > ;
}
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() > ;
} 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则表示操作失败。