zoukankan      html  css  js  c++  java
  • EF之增删改查

    增成功后EF容器里面的实体不会被销毁,EF查询出来的都是代理类对象或集合
    //
    1.0 创建实体 BlogUser usrModel = new BlogUser() { LoginName = "xiaobai1", LoginPwd = "4297F44B13955235245B2497399D7A93", CnName = "小白", Email = "xiaobai@oumind.com", IsDel = false, IsLock = 0, AddTime = DateTime.Now, LastLoginIP = "127.0.0.1", LastLoginTime = DateTime.Now }; //2.0 调用EF容器,向指定的 属性中(表) 添加实体对象 db.BlogUsers.Add(usrModel); //3.0 调用EF容器的 SaveChanges方法,将容器里的对象 保存到数据库,并返回受影响行数! int resCount = db.SaveChanges(); //4.0 新增后,主键属性Id,会被赋值(新增后的id) MessageBox.Show(usrModel.Id.ToString());
     1 批量添加
     2 //1.0 创建实体1
     3             BlogUser usrModel = new BlogUser()
     4             {
     5                 LoginName = "xiaobai2",
     6                 LoginPwd = "4297F44B13955235245B2497399D7A93",
     7                 CnName = "小白2",
     8                 Email = "xiaobai2@oumind.com",
     9                 IsDel = false,
    10                 IsLock = 0,
    11                 AddTime = DateTime.Now,
    12                 LastLoginIP = "127.0.0.1",
    13                 LastLoginTime = DateTime.Now
    14             };
    15 
    16             //1.0 创建实体2
    17             BlogUser usrModel2 = new BlogUser()
    18             {
    19                 LoginName = "xiaobai3",
    20                 LoginPwd = "4297F44B13955235245B2497399D7A93",
    21                 CnName = "小白3",
    22                 Email = "xiaobai3@oumind.com",
    23                 IsDel = false,
    24                 IsLock = 0,
    25                 AddTime = DateTime.Now,
    26                 LastLoginIP = "127.0.0.1",
    27                 LastLoginTime = DateTime.Now
    28             };
    29 
    30             db.BlogUsers.Add(usrModel);
    31             db.BlogUsers.Add(usrModel2);
    32             int resCount = db.SaveChanges();
    33             MessageBox.Show("受影响行数:" + resCount);
     1 #region 5.0 Ef 删除 的3中方式
     2         private void btnDel_Click(object sender, EventArgs e)
     3         {
     4             //1.0 EF 推荐删除方式 - 先查,再删
     5             ////1.1 先根据id查询 出 要删除的 对象(存入EF容器)
     6             //BlogUser usr = db.BlogUsers.Where(u => u.Id == 45).FirstOrDefault();
     7             ////1.2 将实体对象删除(就是将 容器中的 代理对象的 State改成 Deleted)
     8             //db.BlogUsers.Remove(usr);
     9             ////1.3 将EF容器里所有的对象 根据 State 属性值,生成不同sql语句,更新到数据库
    10             //db.SaveChanges();
    11 
    12             //2.0 使用 Attach + Remove Id = 2051
    13             //BlogUser usr = new BlogUser() { Id = 2051 };//会根据指定主键删除(也只能根据指定id删除)
    14             ////2.1 将对象 附加到 EF容器中
    15             //db.BlogUsers.Attach(usr);//State=Unchanged
    16             //db.BlogUsers.Remove(usr);//State=Deleted
    17             //db.SaveChanges();
    18 
    19             //3.0 手动 设置删除
    20             BlogUser usr = new BlogUser() { Id = 2052 };
    21             //3.1将对象加入 EF容器,并返回 代理对象里的跟踪器
    22             DbEntityEntry entry = db.Entry(usr);//State=unchanged
    23             //3.2将代理对象的状态 改成 删除状态
    24             entry.State = EntityState.Deleted;
    25             //3.3保存
    26             db.SaveChanges();
    27         } 
    28         #endregion
    EF删除
    1      //1.0 先按照条件查询
    2             var list = db.BlogUsers.Where(u => u.IsDel == true).ToList();
    3             //2.0 遍历集合,将 要删除的 对象 的代理对象的State 设置为 Deleted
    4             list.ForEach(u => db.BlogUsers.Remove(u));
    5             //3.0 执行更新
    6             int resCount = db.SaveChanges();
    7             //4.0 获取受影响行数
    8             MessageBox.Show("删除行数:" + resCount);   
    根据条件删除
     1 //1.EF推荐 - 先查,再改
     2             //BlogArticle article = db.BlogArticles.Where(a => a.AId == 2).FirstOrDefault();
     3             //article.ATitle = "我爱广州小蛮腰2";
     4             //article.APlnum = 11;
     5             //db.SaveChanges();
     6 
     7             //2.手动修改
     8             //关闭EF的 为空 检查验证
     9             db.Configuration.ValidateOnSaveEnabled = false;
    10             //2.1 创建实体
    11             BlogUser usrModel = new BlogUser()
    12             {
    13                 Id = 28,
    14                 LoginName = "xiaobai1",
    15                 CnName = "小白"
    16             };
    17             //2.2 加入到EF容器
    18             DbEntityEntry entry = db.Entry(usrModel);//State=Detached ,EF容器部管理此状态的代理对象
    19             //2.3 将代理对象状态 改为 Unchanged 以便接受 EF容器管理
    20             entry.State = EntityState.Unchanged;
    21             //2.4 指定 被修改的属性 对应的 IsModified 值,EF 会根据IsModified值判断是否要生成修改 的sql语句
    22             entry.Property("LoginName").IsModified = true;
    23             entry.Property("CnName").IsModified = true;
    24             //2.5更新到数据库
    25             db.SaveChanges();
    26             //
    27             //db.Configuration.ValidateOnSaveEnabled = true;
    修改

    引用类型不给值就为null

     1 List<BlogUser> listUsers = new List<BlogUser>();
     2             //集合的 SQO 方法 定义在 System.Linq.Enumerable 类中,扩展到 IEnumerable<T>接口上
     3             var listU = listUsers.Where(u => u.Id == 2);
     4 
     5             //--------------------IQueryable 的SQO方法 最终目的是生成 SQL语句,其次才是执行sql语句,获取对象集合---------------
     6             ////EF 上下文里的 属性 都是 DBSet<T>类型,继承关系:DBSet<T> : DBQuery<T> : IQueryable<T>
     7             //var listCates = db.BlogArticleCates;
     8             ////EF的 SQO 方法 定义在 System.Linq.Queryable类中,扩展到 IQueryable<T>接口上
     9             ////返回的是 实现了 IQueryable接口的 DBQuery类 的对象
    10             //var listCates2 = db.BlogArticleCates.Where(c => c.IsDel == false);
    11 
    12             ////排序的SQO方法,返回 IOrderedQueryable 接口:IQueryable接口,所以,也可以继续“链式编程”
    13             //var listCates3 = db.BlogArticleCates.Where(c => c.IsDel == false).OrderBy(c => c.Id).ThenBy(c => c.Name.Length);
    14 
    15             //1.0 EF默认 使用 延迟加载(按需加载) - 由DBQuery对象负责执行
    16             //var listCate = db.BlogArticleCates.Where(c => c.IsDel == false).OrderBy(c => c.Id).ThenBy(c => c.Name.Length);
    17             ////DBQuery只有被第一次访问的时候,才去 数据库查询数据,并 显示
    18             //foreach (var cate in listCate)
    19             //{
    20             //    Console.WriteLine(cate.Id + "," + cate.Name);
    21             //}
    22 
    23             /*强调:凡是通过 EF 查询出来的 都是 代理类 对象 或 集合*/
    24             //2.0 EF 可以直接访问 外键属性(实体类的外键属性都是 virtual 属性,被代理对象重写,所以可以查询数据库)
    25             var listCate = db.BlogArticleCates.Where(c => c.IsDel == false).OrderBy(c => c.Id).ThenBy(c => c.Name.Length);
    26             //    当 访问 实体对象的 外键属性(BlogUser) 的时候,EF会自动根据 外键id(Author),查询 主键表(BlogUsers表)
    27             //    EF针对外键查询时,有优化:相同外键值 只查询一次!(比如 2个文章分类的作者都是 xiaobai,那么只需要查询一次 xiaobai)
    28             foreach (var cate in listCate)
    29             {
    30                 Console.WriteLine(cate.Id + "," + cate.Name + ",作者:" + cate.BlogUser.CnName);
    31             }
    EF查询 和 代理类 和 外键属性(导航属性)
     1  //1.0 通过 Include 方法 生成 连接查询语句 (注意:Include只能跟在 DBSet属性后使用,然后再 调用SQO方法)
     2             //var list = db.BlogArticleCates.Include("BlogUser").Include("BlogArticles").Where(c => c.IsDel == false);
     3             //foreach (var item in list)
     4             //{
     5             //    Console.WriteLine(item.Id + "," + item.Name + ",作者:" + item.BlogUser.CnName+",文章数量:"+item.BlogArticles.Count);
     6             //}
     7 
     8             //2.0 通过 Select 方法 自动生成 连接查询语句,条件:在Select中使用到 外键属性(如:当前代码的 c.BlogUser.CnName),EF就会生成连接查询语句
     9             var list2 = db.BlogArticleCates.Where(c => c.IsDel == false).Select(c => new { ID = c.Id, Name = c.Name, AuthorName = c.BlogUser.CnName }).ToList();
    10             list2.ForEach(c => Console.WriteLine(c.ToString()));
    EF连接查询
    1 int resCount = db.Database.ExecuteSqlCommand("update BlogUser set LoginName=@lname where id=28", new SqlParameter("lname", "xiaobai"));
    2             MessageBox.Show(resCount.ToString());
    EF直接执行SQL语句
  • 相关阅读:
    [NOIp2009] $Hankson$ 的趣味题
    [洛谷P1730] 最小密度路径
    [NOIp2015] 运输计划
    [NOIp2012] 借教室
    [NOIp2012] 国王游戏
    [NOIp2016] 蚯蚓
    [洛谷P1272] 重建道路
    [洛谷P1273] 有线电视网
    [ZJOI2010] 数字计数
    ☆ [HDU2089] 不要62「数位DP」
  • 原文地址:https://www.cnblogs.com/huanglexian/p/3593100.html
Copyright © 2011-2022 走看看