EF简单增删改查
一. 主要内容
1. 数据持久层框架:EF,NHibernate,ibaties(半开放的)。
2. 对象关系映射。
3. 生成外键对象。
4. T4模板。(VS里面需要装T4 Editor插件。)
5. EF上下文(EF容器)->.Context.cs。
6. EF简单的增删改查。
查询:利用部分类的特性重写方法来进行方法的扩展。
修改(SQL Serrver Profiler跟踪):
先查询,再修改,再保存更改。
7. 延迟加载(延时查询、按需加载)和即时查询。
延迟加载的用途一:
SQL语句条件不确定,所以不能立即进行查询,延迟加载以确定所有条件完成,等开始用的时候才开始查询。
延迟加载的用途二(外键延迟):
对于外键实体属性的延迟加载。
按需加载的缺点:
每次调用外键实体时,都会去查询数据库(EF小优化:相同的外键实体只查询一次),这时候用即使加载比较好。
8. 延迟加载二视频里面的:数据库改变,则EF实体不会对应改变,可以选择从数据库更新模型。
9. EF的连接查询
include(“User”),通过include方法,可以告诉EF连接查询哪个外键属性。
10. EF容器(EF数据上下文)
修改时,不用Attach方式,使用Entry方式。
11. 批处理
12. MODELFirst(实体优先)
13. EF补充:Select方法能自动生成inner join语句。
二. 源代码
1 using System; 2 using System.Collections.Generic; 3 using System.Data.Entity; 4 using System.Data.Entity.Infrastructure; 5 using System.Linq; 6 using System.Text; 7 using System.Threading.Tasks; 8 9 namespace EFTest 10 { 11 class Program 12 { 13 static LeaveWordBoardEntities db = new LeaveWordBoardEntities(); 14 static void Main(string[] args) 15 { 16 Querry(); 17 } 18 19 static Program() 20 { 21 //取消自动验证所跟踪的实体 22 db.Configuration.ValidateOnSaveEnabled = false; 23 } 24 25 #region 1.0 新增 26 /// <summary> 27 /// 新增 28 /// </summary> 29 static void Add() 30 { 31 User uObj = new User() 32 { 33 uName = "HUOAA11", 34 uLoginName = "a11", 35 uPwd = "a11", 36 uIsDel = false, 37 uAddTime = DateTime.Now 38 }; 39 //两种不同的新增方式:本质上都是把该对象标记为新增,让EF上下文来执行新增操作。 40 //db.Users.Add(uObj); 41 DbEntityEntry<User> entry = db.Entry<User>(uObj); 42 entry.State = EntityState.Added; 43 db.SaveChanges(); 44 Console.WriteLine("新增成功!"); 45 } 46 #endregion 47 48 #region 2.0 简单查询 49 /// <summary> 50 /// 简单查询 51 /// </summary> 52 static void Querry() 53 { 54 //1.1 延时查询一 55 //DbQuery<User> i = db.Users.Where(u => u.uLoginName == "HUOTENG").OrderBy(u => u.uId) as DbQuery<User>; 56 //User user01 = i.FirstOrDefault(); 57 //Console.WriteLine(user01.uName); 58 59 //1.2 延时查询二:针对于外键实体 60 //对于外键属性而言,EF会用这个外键属性时才去查询对应的表。 61 //IQueryable<UsersAddress> addrs = db.UsersAddresses.Where(a=>a.udUId==2);//真实返回的DBQuery对象,以接口方式返回 62 ////a. 此时只查询了地址表 63 //UsersAddress addr01 = addrs.FirstOrDefault(); 64 ////b. 查询地址对应的用户表 65 //Console.WriteLine(addr01.User.uName); 66 //c. 按需加载的缺点:会为每次调用外键实体时,都会去查询数据库。 67 //IQueryable<UsersAddress> addrs = db.UsersAddresses; 68 //foreach (UsersAddress add in addrs) 69 //{ 70 // Console.WriteLine(add.udAddress+":userName="+add.User.uName); 71 //} 72 //1.3 连接查询,生成innner join 73 //IQueryable<UsersAddress> addrs = db.UsersAddresses.Include("User"); 74 //foreach (UsersAddress add in addrs) 75 //{ 76 // Console.WriteLine(add.udAddress + ":userName=" + add.User.uName); 77 //} 78 //IQueryable<Msg> msgs = db.Msgs.Include("User").Include("User1"); 79 //foreach (Msg msg in msgs) 80 //{ 81 // Console.WriteLine(msg.mId + "," + msg.User.uName + "," + msg.User1.uName + "," + msg.mMsg); 82 //} 83 //1.4 另一种方式的连接查询Select 84 var addrs = db.UsersAddresses.Where(a => a.udUId == 1).Select(a => new { aId = a.udUId, aAddress = a.udAddress, aUserName = a.User.uName }).ToList(); 85 86 87 //2. 变相的即时查询 88 //List<User> list = db.Users.Where(u => u.uName == "HUOAA").ToList(); 89 //list.ForEach(u => Console.WriteLine(u.ToString())); 90 } 91 #endregion 92 93 #region 3.0 先查询再修改 94 /// <summary> 95 /// 先查询再修改 96 /// </summary> 97 static void Edit() 98 { 99 User user = db.Users.Where(u => u.uId == 3).FirstOrDefault(); 100 user.uName = "nihaoa2"; 101 db.SaveChanges(); 102 Console.WriteLine("修改成功!"); 103 } 104 #endregion 105 106 #region 4.0 直接修改 107 /// <summary> 108 /// 直接修改 109 /// </summary> 110 static void Edit2() 111 { 112 ////1. 查询出一个要修改的对象,此时返回的是一个User类的代理类对象 113 //User user = db.Users.Where(u => u.uId == 2).FirstOrDefault(); 114 //Console.WriteLine("修改前:"+user.ToString()); 115 ////2. 如果被修改,会在EF上下文容器中标记该属性为已修改 116 //user.uName = "刘德华"; 117 ////3. EF上下文进行检查,找到标记修改的属性,生成对应的UPDATE语句进行修改 118 //db.SaveChanges(); 119 //Console.WriteLine("修改后:"+user.ToString()); 120 121 //Entry方式修改 122 User user = new User() { uId = 2, uName = "小白", uLoginName = "xiaobai", uPwd = "13", uAddTime = DateTime.Now, uIsDel = false }; 123 DbEntityEntry<User> entry = db.Entry<User>(user); 124 entry.State = EntityState.Unchanged; 125 entry.Property("uName").IsModified = true; 126 db.SaveChanges(); 127 Console.WriteLine("修改成功!"); 128 } 129 #endregion 130 131 #region 5.0 删除 132 /// <summary> 133 /// 删除 134 /// </summary> 135 static void Del() 136 { 137 User u = new User() { uId = 4 }; 138 db.Users.Attach(u); 139 db.Users.Remove(u); 140 /* 141 * 也可以用Entry来附加和修改 142 * DbEntityEntry<User> entry = db.Entry<User>(u); 143 * entry.State = EntityState.Deleted; 144 */ 145 db.SaveChanges(); 146 } 147 #endregion 148 149 #region 6.0 批处理 150 /// <summary> 151 /// 6.0 批处理 152 /// </summary> 153 static void SaveBatched() 154 { 155 //6.1 新增 156 //User u1 = new User() 157 //{ 158 // uName = "asd", 159 // uLoginName = "c", 160 // uPwd = "asdf", 161 // uIsDel = false, 162 // uAddTime = DateTime.Now 163 //}; 164 //db.Users.Add(u1); 165 166 //6.2 修改 167 User u2 = new User() { uId = 8, uName = "小黑" }; 168 DbEntityEntry<User> entry = db.Entry<User>(u2); 169 entry.State = EntityState.Unchanged; 170 entry.Property("uName").IsModified = true; 171 172 //6.3 删除 173 //User u3 = new User() { uId=7}; 174 //db.Users.Attach(u3); 175 //db.Users.Remove(u3); 176 177 //6.4 进行统一的批处理 178 db.SaveChanges(); 179 Console.WriteLine("批处理完成!"); 180 } 181 #endregion 182 183 #region 7.0 批处理添加大量数据 184 /// <summary> 185 /// 批处理添加大量数据 186 /// </summary> 187 static void BatchAdd() 188 { 189 for (int i = 0; i < 50; i++) 190 { 191 User u = new User() 192 { 193 uName = "qwer" + i, 194 uLoginName = "qwer" + i, 195 uPwd = "qwer" + i, 196 uIsDel = true, 197 uAddTime = DateTime.Now 198 }; 199 db.Users.Add(u); 200 } 201 db.SaveChanges(); 202 Console.WriteLine("批处理完成!~"); 203 } 204 #endregion 205 } 206 }