ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【Entity Framework】EF中的增删改查 [打印本页]

作者: 麻花痒    时间: 2024-10-14 04:54
标题: 【Entity Framework】EF中的增删改查
【Entity Framework】EF中的增删改查


  

一、概述

Entity Framework是一个O/R Mapping的实例框架,前面的博文介绍了Entity Framework的知识体系,本文将介绍EF基本利用,Entity Framework操作数据库,完成基本的增删改查。
二、DbContext数据上下文

DbContext是Entity Framework中的一个核心的类,它充当了应用程序和数据库之间的桥梁。DbContext紧张负责以下任务:

三、EntityState五个状态值

SavaChanged()用于提交数据,db.SaveChanged() 返回值是数据库中有几条数据被影响,以是你可以用db.SaveChanged()>0来判定是否乐成插入,修改,删除数据。
当实行SaveChanged()方法实行期间,会根据EntityState的值,决定是去新增(Added)、修改(Modified)、删除(Deleted)。来实行操作。
  1.   db.Entry(userinfo).State = EntityState.Added;
复制代码
序号字段值说明1Added4该对象是已添加到对象上下文的新对象,但尚未调用SaveChanges()方法。在保持更改后,对象状态更改为Unchanged。处于Added状态的对象在ObjectStateEntity中没有原始值。2Deleted8已从对象上下文中删除该对象,在生存更改后,对象状态更改为Detached。3Detached1该对象在但未被跟踪。实体在创建之后且添加到对象上下文之前处于此状态。通过调用Detach(Object)方法从上下文中移除实体后,或者利用NoTrackingMergeOption加载实体后,该实体也会处于此状态。没有与处于ObjectStateEntry状态对象关联的Detached实体。4Modified16对象上的一个标量属性已修改,但尚未调用SaveChanges()方法。在没有更改跟踪代理的POCO实体中,假如调用Modified方法,则已修改属性的状态将更改为DetechChanges()。生存更改后,对象状态更改为Unchanged。5Unchanged2自附加到上下文中后,或自上次调用SaveChanges()方法后,该对象尚未修改。 四、EF添加数据

要在数据源中插入数据时,必须创建实体范例的实例,并将该对象添加到对象上下文。 若要将新对象生存到数据源中,必须先设置不支持 null 值的全部属性。 利用实体框架 天生的类时,思量利用实体范例的静态 Create对象名称 方法创建实体范例的新实例。 实体数据模型 工具天生实体范例时,会在每个类中包含此方法。 此创建方法用于创建对象的实例并设置此类的不能为 null 的全部属性。 此方法对于在 CSDL 文件中已应用 Nullable="false" 特性的每个属性都包含一个参数。
4.1 EF Add方式

  1. RbacDBEntities db = new RbacDBEntities();
  2. Role r1 = new Role()
  3. {
  4.     Name = “方式1”,
  5.     Remark = “备注1”
  6. };
  7. db.Roles.Add(r1);
  8. db.SaveChanges();
复制代码
4.2 EF 通过改变对象的状态为 Added

  1. Role r2 = new Role()
  2. {
  3.     Name = “方式2”,
  4.     Remark = “备注2”
  5. };
  6. db.Entry(r2).State = System.Data.Entity.EntityState.Added;
  7. db.SaveChanges();
复制代码
4.3 调用方sql

  1. string sql = @“insert into roles values(‘方式3’,‘备注3’)”;
  2. db.Database.ExecuteSqlCommand(sql);
  3. db.SaveChanges();
复制代码
4.4 调用存储过程

  1. db.cp_insert_role(“方法4”, “备注4”);
  2. Console.Read();
复制代码
可以利用以下方法之一将新对象添加到对象上下文中:

在添加新对象时需要思量下列留意事项:

五、EF修改数据

5.1 不查询数据库,主键必须赋值

为避免先查询数据库,可以直接将被修改的实体对象,添加到EF中管理,并手动设置其为未修改状态(Unchanged),同时设置被修改的实体对象的包装类对象对应属性为修改状态。
优点: 修改前不需要查询数据库
  1. UserInfoes userInfonew = new UserInfoes()
  2. {
  3.     UserId=userInfo.UserId,
  4.     Email = userInfo.Email,
  5.     FirstName = userInfo.FirstName,
  6.     LastName = userInfo.LastName,
  7.     LastUpdateBy = GetCurrentUserGuid(),
  8.     LastUpdate = DateTime.Now
  9. };
复制代码
假如利用Entry附加实体对象到数据容器中,则需要手动设置实体包装类的对象的状态为Unchanged,或利用Attach(Attach方法:将给定实体以 System.Data.EntityState.Unchanged 状态附加到上下文中从解释可以看出Attach方法紧张目的就是把一个没有被dbContext跟踪的对象附加到dbCotext中使其被dbContext跟踪)。
  1. db.Entry(userInfonew).State = System.Data.Entity.EntityState.Unchanged;
复制代码
或者
  1. db.UserInfoes.Attach(userInfonew);
复制代码
  1. db.SaveChanges();
复制代码
  特别提示:主键必须赋值,假如不赋值,会报错“Store update,insert or delete statement affected an unexpected number of rows(0)”
  5.2 先查询实体再更新

  1. var query = await (from a in db.MesMachineConfig
  2.                     join c in db.Site_LinePosition
  3.                     on new {A = a.LineNum,B = a.MCPosition} equals new {A= c.LineNum,B=c.MCPosition}
  4.                     join b in db.DGHKROneReelNumManagerParamsSettings on a.MachineNum equals b.MachineNum into rightRow
  5.                     from rw in rightRow.DefaultIfEmpty()
  6.                     where a.Enable == "Y" && a.Size == dghkrOneReelNumManagerParamsSettingsDto.Size
  7.                     select new {a,rw}
复制代码
  Attach的时间会报如下错误:因为相同范例的其他实体已具有相同的主键值。在利用 “Attach” 方法或者将实体的状态设置为 “Unchanged” 或 “Modified” 时假如图形中的任何实体具有冲突键值,则可能会发生上述举动。
  六、EF删除数据

6.1 先查询数据,再根据查询的对象 ,删除对象

  1. var delSysUser = accountContext.SysUsers.FirstOrDefault(m.m.Id==userId)
  2. if(delSysUser==null)
  3. {
  4.     accountContext.SysUsers.Remove(delSysUser);
  5. }
  6. var i = accountContext.SaveChanges();
复制代码
6.2 本身创建对象,后附件,然后实行删除

  1. SysUser delSysUser = new SysUser(){Id = delId};
  2. accountContext.SysUsers.Attach(delSysUser);
  3. accountContext.SysUsers.Remove(delSysUser);
  4. var i = accountContext.SaveChanges();
复制代码
6.3 本身创建对象,然后放入EF容器,然后删除

  1. SysUser delSysUser=new SysUser(){Id = delId};
  2. DbEntityEntry<SysUser> entityEntry = accountContext.Entry(delSysUser);
  3. entityEntry.State = EntityState.Deleted;
  4. var i = accountContext.SaveChanges();
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4