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

正常情况下的增删改查代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
#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语句的方法

1
2
3
db.Database.ExecuteSqlCommand("");
            //db.Database.SqlQuery
            //db.Database.SqlQuery<T>

  

Entity FrameWork 5 增删改查 & 直接调用sql语句,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。