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

#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>

  

时间: 2024-08-24 06:17:30

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

Entity FrameWork 5 增删改查 &amp; 直接调用sql语句

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 = "asd

关于MySql中数据库、表的操作以及增删改查等一些SQL语句注意事项

(1)怎么在cmd中复制粘贴内容? 参考:http://jingyan.baidu.com/article/93f9803fd3a4dde0e46f55f5.html (2)怎么打开进入和退出数据库? --其中-h是主机名,可以写IP地址127.0.0.1,回车后,提示输入密码即可. mysql -h localhost -u root -p --退出数据库是exit或者quit或者CTRL+C. (3)在dos中以及mysql中修改mysql的root密码 --在dos中,即不需要进入mysq

robot framework 数据库增删改查

使用rf做数据库的增删改查操作可以定义关键字,方便后续使用 关键字如下: 一.sql_查 1 [Arguments] ${host} ${port} ${user} ${passwd} ${db} ${sql} 2 Connect To Database Using Custom Params pymysql host='${host}', port=${port}, user='${user}', passwd='${passwd}', db='${db}',charset='utf8' 3

mac下使用MyBatis增删改查(mysql,Java)

1.安装mysql 下载地址为http://dev.mysql.com/downloads/mysql/,选择dmg类型的直接下载,跳转的页面要求注册或登录,可以直接点击页面最下面的 No thanks, just start my download. 下载,安装 安装结束会提示默认密码: 2016-01-26T03:15:17.366026Z 1 [Note] A temporary password is generated for [email protected]: o)pa_.adT2

servlet的增删改查

这是一个简单的servlet增删改查界面 t3.sql数据库: /* SQLyog 企业版 - MySQL GUI v8.14 MySQL - 5.5.25a : Database - test ********************************************************************* */ /*!40101 SET NAMES utf8 */; /*!40101 SET SQL_MODE=''*/; /*!40014 SET @[email pr

hibernate之增删改查demo

1 package dao; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import org.hibernate.Query; 7 import org.hibernate.SQLQuery; 8 import org.hibernate.Transaction; 9 10 import com.sun.org.apache.bcel.internal.generic.GETSTATIC; 11 12 import

使用JDBC分别利用Statement和PreparedStatement来对MySQL数据库进行简单的增删改查以及SQL注入的原理

一.MySQL数据库的下载及安装 https://www.mysql.com/ 点击DOWNLOADS,拉到页面底部,找到MySQL Community(GPL)Downloads,点击 选择下图中的MySQL Community Server 选择想要的版本进行下载 之后的步骤,因为本人已经安装过MySQL数据库,而卸载重装会比较麻烦,卸载不干净会导致新的装不上,所以可以参考下面的博客,因为官网的改动,前面的部分已经与该博客不符,按照本人在上面的介绍寻找即可 https://blog.csdn

mysql存储过程+事件统计mysql增删改查qps

/*统计mysql增删改查 qps 的sql脚本*/; DROP TABLE IF EXISTS  qpsInfo ; CREATE TABLE qpsInfo( id INT PRIMARY KEY AUTO_INCREMENT, `type` INT COMMENT "1 insert,2 delete,3 update,4 select", `count` INT COMMENT "更新的总数", `qps` INT COMMENT "10秒钟更新的

heibernate增删改查总结一下自己的不足

难点也就我不熟悉的是数据库语句的书写,要加强复杂查询语句的书写 1 /* 简单的在共享类中已经可以用的了 2 * 总结: 3 * 4 * --------------------------------------查询 5 * 1.hql查询 6 * 7 * StringBuffer hql = new StringBuffer("from Station where 1=1"); 8 * 9 * Query q = gs().createQuery(hql.toString());