#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);
//4.3标记为删除 注意:此方法 就是 起到了 标记 当前对象 为 删除状态 !
db.Users.Remove(u); /*
也可以使用 Entry 来附加和 修改
DbEntityEntry<User> entry = db.Entry<User>(u);
entry.State = System.Data.EntityState.Deleted;
*/ //4.4执行删除sql
db.SaveChanges();
Console.WriteLine("删除成功~~~");
}
#endregion #region 5.0 批处理 -- 上下文 SaveChanges 方法 的 好处!!!!
/// <summary>
/// 批处理 -- 上下文 SaveChanges 方法 的 好处!!!!
/// </summary>
static void SaveBatched()
{
//5.1新增数据
User uObj = new User()
{
uName = "刘德华",
uLoginName = "aaa",
uPwd = "asdfasdfasdfsadf",
uIsDel = false,
uAddtime = DateTime.Now
};
db.Users.Add(uObj); //5.2新增第二个数据
User uObj2 = new User()
{
uName = "刘德华2",
uLoginName = "aaa2",
uPwd = "asdfasdfasdfsadf2",
uIsDel = false,
uAddtime = DateTime.Now
};
db.Users.Add(uObj2); //5.3修改数据
User usr = new User() { uId = 8, uName = "又黑了~~~" };
DbEntityEntry<User> entry = db.Entry<User>(usr);
entry.State = System.Data.EntityState.Unchanged;
entry.Property("uName").IsModified = true; //5.4删除数据
User u = new User() { uId = 11 };
//4.2附加到 EF中
db.Users.Attach(u);
//4.3标记为删除 注意:此方法 就是 起到了 标记 当前对象 为 删除状态 !
db.Users.Remove(u); db.SaveChanges();
Console.WriteLine("批处理 完成~~~~~~~~~~~~!");
}
#endregion #region 5.1 批处理 -- 一次新增 50条数据 -void BatcheAdd()
/// <summary>
/// 5.1 批处理 -- 一次新增 50条数据
/// </summary>
static void BatcheAdd()
{
for (int i = 0; i < 50; i++)
{
User uObj = new User()
{
uName = "刘德华" + i,
uLoginName = "aaa" + i,
uPwd = "asdfasdfasdfsadf" + i,
uIsDel = false,
uAddtime = DateTime.Now
};
db.Users.Add(uObj);
}
db.SaveChanges();
}
#endregion

  

、、直接调用sql语句的方法
db.Database.ExecuteSqlCommand("");
//db.Database.SqlQuery
//db.Database.SqlQuery<T>

  

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

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

    class="brush:csharp;gutter:true;"> #region 1.0 新增 -void Add() /// <summary> /// 1 ...

  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. vue-router 介绍

    vue-router是官方的路由管理工具,用于组建单页面应用很方便快捷.还记得我们在上一篇文章中,使用vue-cli创建的hello-vue的那个项目吗?打开项目,我们先看下目录结构: 看了上面的目录 ...

  2. 在html文件引入其它html文件的几种方法

    1.IFrame引入,看看下面的代码 <IFRAME NAME="content_frame" width=100% height=600 marginwidth=0 mar ...

  3. ORACLE 36进制和10进制,互相转换函数

    第一部分 --36转10进制 create or replace function f_36to10 (str varchar) return int  is returnValue int;   s ...

  4. unsigned double

    最近犯了一个错误: 定义变量类型的时候竟然定义了unsigned double的类型.由于编译能够通过,因此一直没有发现这样写会有什么样的问题. 今天一次偶然的测试中发现这些变量的值都是整数.一开始觉 ...

  5. JS中小数如何转化为百分数并能四舍五入

    <script type="text/javascript">//n表示百分数保留的位数 function toPercent(n){ n = n || 2; retu ...

  6. Hybrid--WebView中使用Ajax

    Hybrid框架下的app,使用的Ajax.须要注意的是UIWebViewDelegate不会监測到Ajax的request.也就是再运行Ajax代码时.shouldStartLoadWithReuq ...

  7. 传递一个父id返回所有子id的用法,可用于删除父级以下的所有子级

    先在common文件夹建立一个function.php文件,然后写一个递归函数,传递一个父id返回所有子id,如下: function getChildrenId($node,$pid){ $arr= ...

  8. Parallel Tests

    Parallel Tests Parallel Android Tests Appium provides a way for users to automate multiple Android s ...

  9. 使用官方Android-support-v7在低版本上使用ActionBarActivity

    昨天晚上更新了下Android SDK Manager,发现Extras下的Android Support Library已经更新到19.1了,上网一查原来是sdk\extras\android\su ...

  10. office web apps的搭建部署(1)(写于2017.12.27)

    因为业务方面的需求,项目要求搭建office-web-apps这个玩意儿,做一个在线预览编辑的功能,为了方便,我下面都用OWA代替这个服务. 首先说一下什么是office-web-apps-serve ...