class="brush:csharp;gutter:true;">        #region 1.0 新增 -void Add()
/// <summary>
/// 1.0 新增
/// </summary>
static void Add()
{
//1.1创建实体对象
User uObj = new User()
{
uName = "刘德华",
uLoginName = "aaa",
uPwd = "asdfasdfasdfsadf",
uIsDel = false,
uAddtime = DateTime.Now
};
//1.2通过EF新增到数据库
//1.2.1将对象 加入到 数据上下文 的 User集合中
//db.Users.Add(uObj);
DbEntityEntry<User> entry = db.Entry<User>(uObj);
entry.State = System.Data.EntityState.Added;
//1.2.2调用数据上下文 的 保存方法,将 对象 存数数据库
db.SaveChanges();
Console.WriteLine("保存成功~~!");
}
#endregion #region 2.0 简单查询 -void Query()
/// <summary>
/// 2.0 简单查询
/// </summary>
static void Query()
{
//2.0 IEnumerable(集合) 和 IQueryable(EF里的DbSet<T>) 里的 SQO 本质不一样!:
//2.1 集合 的 标准查询运算符 方法 ,是来自于 System.Linq.Enumerable 里 给 IEnumerable 接口添加的扩展方法
//List<string> listStr = new List<string>();
//listStr.Where //EF上下文里的 DBSet<T> 里的 标准查询运算符 方法,来自于 System.Linq.Queryable 里给 IQueryable接口 添加的扩展方法
//2.2 变相的 即时查询
List<User> list = db.Users.Where(u => u.uName == "刘德华").ToList();
list.ForEach(u => Console.WriteLine(u.ToString()));
}
#endregion #region 2.1 简单查询 延迟加载 -void QueryDelay_01()
//【延时加载】 看成两种:
//2.1 EF本身查询方法 返回的都是 IQueryable接口,此时并未查询数据库;只有当调用接口方法 获取 数据时,才会查询数据库
//2.1.1 【延时加载】,本质原因之一:当前可能通过多个SQO方法 来组合 查询条件,那么每个方法 都只是添加一个查询条件而已,无法确定本次查询条件 是否 已经添加结束
// 所以,没有办法在每个SQO方法的时候确定SQL语句是什么,只能返回一个 包含了所有添加的条件的 DBQuery 对象,
// 当使用这个 DBQuery对象 的时候,才根据所有条件 生成 sql语句,查询数据库
static void QueryDelay_01()
{
DbQuery<User> dbQuery = db.Users.Where(u => u.uLoginName == "刘德华").OrderBy(u => u.uName).Take(2) as System.Data.Entity.Infrastructure.DbQuery<User>;
//获得 延迟查询对象后,调用对象的 获取第一个数据方法,此时,【就会根据之前的条件】,生成sql语句,查询数据库了~~!
User usr01 = dbQuery.FirstOrDefault();// ToList()......
Console.WriteLine(usr01.uLoginName);
} //2.1.2【延迟加载】- 针对于 外键实体 的延迟(按需加载)!
// 本质原因之二:对于外键属性而言,EF会在用到这个外键属性的时候才去查询 对应的 表。
static void QueryDelay_02()
{
IQueryable<UsersAddress> addrs = db.UsersAddresses.Where(a => a.udUId == 1);//真实返回的 DbQuery 对象,以接口方式返回
//a.此时只查询了 地址表
UsersAddress addr01 = addrs.FirstOrDefault();
//b.当访问 地址对象 里的 外键实体时,EF会查询 地址对应 的用户表;查询到之后,将数据 装入 这个外键实体
Console.WriteLine(addr01.User.uName); //c.【延迟加载】按需加载 的缺点:每次调用外键实体时,都会去查询数据库(EF有小优化:相同的外键实体只查一次)
IQueryable<UsersAddress> addrs2 = db.UsersAddresses;
foreach (UsersAddress add in addrs2)
{
Console.WriteLine(add.udAddress + ":userName=" + add.User.uName);
}
}
#endregion #region 2.2 连接查询(生成 inner join) -void QueryInnerJoin()
/// <summary>
/// 2.2 连接查询(生成 inner join)
/// </summary>
static void QueryInnerJoin()
{
//通过Include方法,设置 EF 生成 sql 语句时,使用 inner join 把 地址表对应的 User属性 也查出来
// select * from UsersAddresses a inner join Users u on a.udId =u.id
IQueryable<UsersAddress> addrs = db.UsersAddresses.Include("User").Where(a => a.udId == 1);
foreach (UsersAddress add in addrs)
{
Console.WriteLine(add.udAddress + ":userName=" + add.User.uName);
} //练习:查询消息表的同时,显示 消息发送人 和 接收名字
IQueryable<Msg> msgs = db.Msgs.Include("User").Include("User1");
foreach (Msg m in msgs)
{
Console.WriteLine(m.mId + ",发送人:" + m.User.uName + ",接收人:" + m.User1.uName + ",消息内容:" + m.mMsg);
}
}
#endregion #region 3.0 官方推荐的 修改方式(先查询,再修改)
/// <summary>
/// 3.0 官方推荐的 修改方式(先查询,再修改)
/// </summary>
static void Edit()
{
//1.查询出一个 要修改的对象 -- 注意:此时返回的 是 一个 User类的 代理类对象(包装类对象)
User usr = db.Users.Where(u => u.uId == 1).FirstOrDefault();
Console.WriteLine("修改前:" + usr.ToString());
//2.修改内容 -- 注意:此时其实操作的 是 代理类对象 的属性,这些属性,会将 值 设置给 内部的 User对象对应的属性,同时 标记此属性为已修改状态
usr.uName = "刘德华";
usr.uLoginName = "liudehua";
//3.重新保存到数据库 -- 注意:此时 ef上下文,会检查容器内部 所有的对象,找到 标记为修改的 对象,然后 找到 标记为修改的 对象属性,生成对应的 update语句 执行!
db.SaveChanges();
Console.WriteLine("修改成功:");
Console.WriteLine(usr.ToString());
}
#endregion #region 3.1 自己优化的 修改方式(创建对象,直接修改)
/// <summary>
/// 3.1 自己优化的 修改方式(创建对象,直接修改)
/// </summary>
static void Edit2()
{
//1.查询出一个 要修改的对象
User usr = new User() { uId = 8,uName="小白~~~"};
//2.将 对象 加入 EF容器,并获取 当前实体对象 的 状态管理对象
DbEntityEntry<User> entry = db.Entry<User>(usr);
//3.设置 该对象 为被修改过
entry.State = System.Data.EntityState.Unchanged;
//4.设置 该对象 的 uName属性 为 修改状态,同时 entry.State 被修改为 Modified 状态
entry.Property("uName").IsModified = true; //var u = db.Users.Attach(usr);
//u.uName = "小白~~"; //3.重新保存到数据库 -- ef 上下文 会 根据 实体对象的 状态 ,根据 entry.State =Modified 的值 生成 对应的 update sql 语句
db.SaveChanges();
Console.WriteLine("修改成功:");
Console.WriteLine(usr.ToString());
}
#endregion #region 4.0 删除 -void Delete()
/// <summary>
/// 4.0 删除
/// </summary>
static void Delete()
{
//4.1创建要删除的 对象
User u = new User() { uId = 10 };
//4.2附加到 EF中
db.Users.Attach(u);

Entity FrameWork 5 增删改查 & 直接调用sql语句的更多相关文章

  1. Entity FrameWork 5 增删改查 & 直接调用sql语句 ?

    #region 1.0 新增 -void Add() /// <summary> /// 1.0 新增 /// </summary> static void Add() { / ...

  2. Entity Framework DBContext 增删改查深度解析

    Entity Framework DBContext 增删改查深度解析 有一段时间没有更新博客了,赶上今天外面下雨,而且没人约球,打算把最近对Entity Framework DBContext使用的 ...

  3. ASP.NET中使用Entity Framework开发增删改查的Demo(EF增删改查+母版页的使用)

    这里更多的是当作随身笔记使用,记录一下学到的知识,以便淡忘的时候能快速回顾 这里是该项目的第二部分, 第一部分 第二部分(当前部分) 大完结版本 此Demo是新建了一个音乐类型的web,然后使用母版页 ...

  4. AppBox升级进行时 - Entity Framework的增删改查

    AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. Entity Framework新增数据 以新增用户为例,作为对比,先来看下使 ...

  5. Android,java,php开发最基本的知识,mysql sqlite数据库的增删改查代理,sql语句

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985转载请说明出处. 下面是代码: 增加:insert into 数据表(字段1,字段2,字段3) valu ...

  6. 增删改查简单的sql语句

    insert INSERT   INTO    t_stu   (name,age)  VALUES  ('wang',12) INSERT INTO    t_stu   VALUES(NULL,' ...

  7. MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  8. Entity Framework 简单增删改操作

    前言 在 Entity Framework 简单查询操作 中主要是学习了在Entity Framework中的几种不同模式的查询操作,现在主要来学习一下简单的增加.删除.修改操作. 增加 在EF中添加 ...

  9. JDBC 增删改查代码 过滤查询语句

    package test; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; i ...

随机推荐

  1. 推荐一些国内的Jquery CDN免费服务

    Jquery是个非常流行的JS前端框架,在很多网站都能看到它的身影.很多网站都喜欢采用一些Jquery CDN加速服务,这样网站加载jquery会更快.之前火端网络的一些网站都是使用Google的jq ...

  2. nexus的使用

    一.在百度网盘或官网下载nexus,并部署.   注意修改: https://repository.apache.org/content/repositories/releases/    二.下载m ...

  3. 【Android自学日记】两种适配器的使用

    ArrayAdapter适配器: (1)用于显示基本的文字内容 (2)基本使用过程:新建适配器---创建或加载数据源---适配器加载数据源---视图加载适配器 ArrayAdapter(上下文,当前L ...

  4. angular.extend用法实例

      angular.extend:依次将第二个参数及后续的参数的第一层属性(不管是简单属性还是对象)拷贝赋给第一个参数的第一层属性,即如果是对象,则是引用的是同一个对象,并返回第一个参数对象. 实例一 ...

  5. PHP中常见错误

    1.Notice: Undefined variable: 变量名 in 注:使用了一个没有被定义的变量 2.Parse error: syntax error, unexpected T_ELSE ...

  6. Typescript基础类型

    1.布尔值__boolean 2.数字__number----除了支持十进制和十六进制字面量,Typescript还支持ECMAScript 2015中引入的二进制和八进制字面量. 3.字符串__st ...

  7. python之路十七

    jQuery        http://jquery.cuishifeng.cn/        模块 <=>类库    DOM/BOM/JavaScript的类库        版本: ...

  8. jquery插件封装成seajs模块

    jquery直接在html中引入. jquery插件修改为: define(function (require, exports, moudles) { return function (jquery ...

  9. angular 自定义指令 directive transclude 理解

    项目中断断续续的用了下angular,也没狠下心 认真的学习.angular 特别是自定义指令这块 空白. transclude 定义是否将当前元素的内容转移到模板中.看解释有点抽象. 看解释有点抽象 ...

  10. QT特供 CGAL配置流程(基于QT5+VS2015)

    最近做的QT项目涉及计算几何库,需要用到CGAL,其配置着实麻烦,而且相互关联的软件也存在版本兼容一类的问题,在这里就对其配置流程做一些整理说明,以便后来者能够少些烦恼.(注:以下使用Win10作说明 ...