1. Entity Framework的詳細介紹:
Entity Framework簡稱EF,與Asp.net關系與Ado.net關系。
Entity Framework是ado.net中的一組支持開發面向數據的軟件應用程序的技術,是微軟的一個ORM框架。
ORM:object relation mapping 是基於關系型數據庫的數據儲備,實現一個模擬的面向對象的數據訪問接口,理想情況下,基於這樣一個面向對象的接口,持久化一個oo對象應該不需要了解任何關系型數據庫存儲數據的實現細節。
類似的輕量級的orm框架,dapper,patapoct
1. lambda表達式:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { //定義一個委托 public delegate int AddSum(int a,int b); class Program { static void Main(string[] args) { Program p = new Program(); // AddSum addSum = new AddSum(p.Add); // AddSum addSum = delegate(int a, int b) { return a + b; }; //AddSum addSum = (int a, int b) => { return a + b; }; //簡化之后的lambda表達式 AddSum addSum = ( a, b) => { return a + b; }; int sum = addSum(5, 3); Console.WriteLine(sum); Console.ReadKey(); } //public int Add(int a, int b) //{ // return a + b; //} } }
一、第一種使用EF的方法:先有數據庫再建立數據模型
1. 在項目中右擊新建,新建一個ADO.net實體數據模型,選擇從數據庫生成,這種是先有數據庫再建立數據模型的方式。然后依次點擊下一步便可,完成以后切記點擊ctrl+s保存。不然是不會生成數據模型對應的類。
2. 注意:對應的數據庫表必須有主鍵,不然在使用時會報錯。
3. 生成之后的結構如下。

4.使用EF進行相關的增刪改查代碼如下:
新建的web窗體頁面,分別放四個button按鈕便可。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.UI; 6 using System.Web.UI.WebControls; 7 8 namespace WebApplication2 9 { 10 public partial class WebForm1 : System.Web.UI.Page 11 { 12 protected void Page_Load(object sender, EventArgs e) 13 { 14 15 } 16 /// <summary> 17 /// 插入數據 18 /// </summary> 19 /// <param name="sender"></param> 20 /// <param name="e"></param> 21 protected void Button1_Click(object sender, EventArgs e) 22 { 23 UserInfo UserInfo = new UserInfo(); 24 UserInfo.UserName = "張五呀"; 25 UserInfo.UserPass = "123qwe"; 26 UserInfo.RegTime = 2; 27 UserInfo.Email = "wangjin"; 28 AdwResourcesEntities1 db = new AdwResourcesEntities1(); 29 //將數據添加到EF中,並且添加了標記,並且類似於生成了一條insert語句,但是這時候還沒有執行該語句 30 db.UserInfo.Add(UserInfo); 31 //之后執行該代碼時,才會執行insert語句,並且返回受影響行數 32 db.SaveChanges(); 33 //返回剛剛插入的主鍵ID 34 Response.Write(UserInfo.ID); 35 } 36 /// <summary> 37 /// 查詢數據 38 /// </summary> 39 /// <param name="sender"></param> 40 /// <param name="e"></param> 41 protected void Button2_Click(object sender, EventArgs e) 42 { 43 AdwResourcesEntities1 db = new AdwResourcesEntities1(); 44 var userinfolist = from u in db.UserInfo //linq表達式 45 where u.ID == 65 46 select u; 47 //EF的延遲加載機制,只有數據在使用的時候才會去數據庫中查詢,不用的時候不查詢。 48 //只有執行下面的代碼的時候才會去執行,這樣可以提高整體的性能 49 foreach (var userinfo in userinfolist) 50 { 51 Response.Write(userinfo.ID); 52 } 53 //FirstOrDefault 查詢第一條數據或者查詢默認值 54 //userinfolist.FirstOrDefault(); 55 } 56 /// <summary> 57 /// 刪除數據 58 /// </summary> 59 /// <param name="sender"></param> 60 /// <param name="e"></param> 61 protected void Button3_Click(object sender, EventArgs e) 62 { 63 AdwResourcesEntities1 db = new AdwResourcesEntities1(); 64 var userinfolist = from u in db.UserInfo 65 where u.ID == 66 66 select u; 67 //返回第一條數據,如果沒有就放回null 68 UserInfo userinfo = userinfolist.FirstOrDefault(); 69 if (userinfo != null) 70 { 71 db.UserInfo.Remove(userinfo); 72 db.SaveChanges(); 73 Response.Write("刪除成功"); 74 } 75 else 76 { 77 Response.Write("數據有誤"); 78 } 79 80 ////執行刪除的第二種方法 81 //UserInfo userInfo = new UserInfo() {ID=344}; 82 db.Entry<UserInfo>(userinfo).State = System.Data.Entity.EntityState.Deleted; 83 //db.SaveChanges(); 84 } 85 86 /// <summary> 87 /// 修改數據 88 /// </summary> 89 /// <param name="sender"></param> 90 /// <param name="e"></param> 91 protected void Button4_Click(object sender, EventArgs e) 92 { 93 //構建一個 94 AdwResourcesEntities1 db = new AdwResourcesEntities1(); 95 var userinfolist = from u in db.UserInfo 96 where u.ID == 65 97 select u; 98 UserInfo userinfo = userinfolist.FirstOrDefault(); 99 userinfo.UserPass = "qweqwe"; 100 db.Entry<UserInfo>(userinfo).State = System.Data.Entity.EntityState.Modified; 101 db.SaveChanges(); 102 Response.Write("修改成功"); 103 } 104 } 105 }
二、第二種ModelFirst模式使用EF的方法,先建立數據模型,再生成數據庫對應的表。
1. 先在數據庫中新建一個數據庫。
2. 在項目中右擊新建項目,選擇數據源,點擊空模型。
3. 在生成的空白界面中,右擊新增實體,新增之后再新增標量屬性,如果是多表,並且有關聯的表,右擊新增關聯,再右擊根據數據模型生成數據庫。
4. 點擊如下文件,需要點擊執行才會生成數據庫。

5. 使用第二種進行增刪改查的相關代碼如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.UI; 6 using System.Web.UI.WebControls; 7 8 namespace WebApplication1 9 { 10 public partial class WebForm2 : System.Web.UI.Page 11 { 12 protected void Page_Load(object sender, EventArgs e) 13 { 14 15 } 16 /// <summary> 17 /// 插入數據 18 /// </summary> 19 /// <param name="sender"></param> 20 /// <param name="e"></param> 21 protected void Button1_Click(object sender, EventArgs e) 22 { 23 Model2Container db = new Model2Container(); 24 Customer customer = new Customer() {CustomerName="zhangsan",CustomerPwd="123", SubTime=DateTime.Now }; 25 // Customer = customer導航屬性,代表下面的數據屬於上面的值 26 OrderInfo orderInfo1 = new OrderInfo() { ID = Guid.NewGuid(), OrderNum = "10001", CreateDateTime = DateTime.Now,Customer=customer }; 27 OrderInfo orderInfo2 = new OrderInfo() { ID = Guid.NewGuid(), OrderNum = "10002", CreateDateTime = DateTime.Now, Customer = customer }; 28 db.Customer.Add(customer); 29 db.OrderInfo.Add(orderInfo1); 30 db.OrderInfo.Add(orderInfo2); 31 db.SaveChanges();//默認的已經開啟了事務。 工作單元模式。(UnitOfwork) 32 } 33 /// <summary> 34 /// 查詢數據 35 /// </summary> 36 /// <param name="sender"></param> 37 /// <param name="e"></param> 38 protected void Button2_Click(object sender, EventArgs e) 39 { 40 Model2Container db = new Model2Container(); 41 var customerList = from c in db.Customer 42 select c; 43 foreach (var customer in customerList) 44 { 45 Response.Write(customer.CustomerName+":"); 46 47 48 foreach (var orderInfo in customer.OrderInfo)//延遲加載。 49 { 50 Response.Write(orderInfo.OrderNum); 51 } 52 } 53 } 54 /// <summary> 55 /// 根據名字id查詢所有的訂單 56 /// </summary> 57 /// <param name="sender"></param> 58 /// <param name="e"></param> 59 protected void Button3_Click(object sender, EventArgs e) 60 { 61 Model2Container db = new Model2Container(); 62 //var customerInfoList = from c in db.Customer 63 // where c.ID == 1 64 // select c; 65 //var customerInfo = customerInfoList.FirstOrDefault(); 66 //foreach (var orderInfo in customerInfo.OrderInfo) 67 //{ 68 // Response.Write(orderInfo.OrderNum); 69 //} 70 71 var orderInfoList = from o in db.OrderInfo 72 where o.CustomerID == 1 73 select o; 74 foreach (var orderInfo in orderInfoList) 75 { 76 Response.Write(orderInfo.OrderNum); 77 } 78 79 } 80 /// <summary> 81 /// 輸出10001對應的客戶ID 82 /// </summary> 83 /// <param name="sender"></param> 84 /// <param name="e"></param> 85 protected void Button4_Click(object sender, EventArgs e) 86 { 87 Model2Container db = new Model2Container(); 88 var orderInfoList = from o in db.OrderInfo 89 where o.OrderNum == "10001" 90 select o; 91 var orderInfo = orderInfoList.FirstOrDefault(); 92 Customer customer = orderInfo.Customer; 93 Response.Write(customer.CustomerName); 94 } 95 /// <summary> 96 /// 根據人員ID刪除對應數據 97 /// </summary> 98 /// <param name="sender"></param> 99 /// <param name="e"></param> 100 protected void Button5_Click(object sender, EventArgs e) 101 { 102 Model2Container db = new Model2Container(); 103 //var customer = (from c in db.Customer 104 // where c.ID == 1 105 // select c).FirstOrDefault(); 106 //var orderInfoList = customer.OrderInfo; 107 //while (orderInfoList.Count > 0) 108 //{ 109 // var orderInfo = orderInfoList.FirstOrDefault(); 110 // db.Entry<OrderInfo>(orderInfo).State = System.Data.EntityState.Deleted; 111 //} 112 //db.SaveChanges(); 113 114 var orderList = from o in db.OrderInfo 115 where o.CustomerID == 2 116 select o; 117 118 } 119 120 } 121 }
三、第三種codeFirst模式,該模式是指不建立數據模型,並且不建立建立數據庫的情況下,通過代碼的形式去新建一個數據庫。
1. :創建實體類,並且給實體加上特性標簽,並且標注一下實體類之間的關系。
1.1創建classInfo(班級)實體類
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel.DataAnnotations; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace CodeFirstDemo 9 { 10 public class ClassInfo 11 { 12 [Key] //特性標簽 13 public int Id { get; set; } 14 [StringLength(32)] //指定是字符串類型 15 [Required] //必填項 16 public string ClassName { get; set; } 17 [Required] 18 public DateTime CreateTime { get; set; } 19 //表示1對多,指一個班級對應多個學生 20 public virtual ICollection<StudentInfo> StudentInfo { get; set; } 21 } 22 }
1.2 :創建學生實體類
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel.DataAnnotations; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace CodeFirstDemo 9 { 10 public class StudentInfo 11 { 12 [Key] 13 public int Id { get; set; } 14 [StringLength(32)] 15 [Required] 16 public string StuName { get; set; } 17 [Required] 18 public DateTime SubTime { get; set; } 19 public virtual ClassInfo ClassInfo { get; set; } //表明外鍵關系,多對1 20 } 21 }
1.3. 引用Entity
方法1,點擊引用,system.data.Entity
方法2. 新建一個數據模型,之后刪掉,此時已經自動引用了entity
1.4 :創建codefirstdbcontext:dbcontext文件
1 using System; 2 using System.Collections.Generic; 3 using System.Data.Entity; 4 using System.Data.Entity.ModelConfiguration.Conventions; 5 using System.Linq; 6 using System.Text; 7 using System.Threading.Tasks; 8 9 namespace CodeFirstDemo 10 { 11 public class CodeFirstDbContext:DbContext 12 { 13 public CodeFirstDbContext() 14 : base("name=connStr") //對應連接數據庫字符串的名字 15 { 16 17 } 18 protected override void OnModelCreating(DbModelBuilder modelBuilder) 19 { 20 //此代碼的功能是移除復數的約定 就是指生成的表名后面不加S 21 modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 22 } 23 //對應的表 24 public DbSet<ClassInfo> ClassInfo { get; set; } 25 public DbSet<StudentInfo> StudentInfo { get; set; } 26 } 27 }
1.5 :在配置文件構建數據庫鏈接字符串。
1 <configSections> 2 <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 3 </configSections>
1.6:查詢部分數據以及實例創建代碼
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace WebApplication1 { public partial class WebForm3 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } /// <summary> /// 只查詢其中幾列數據 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Button1_Click(object sender, EventArgs e) { //使用HttpContext,只要持續調用,就一直都不會中斷 EFFristModelEntities db = null; if (HttpContext.Current.Items["db"] == null) { db = new EFFristModelEntities(); HttpContext.Current.Items["db"] = db; } else { db = HttpContext.Current.Items["db"] as EFFristModelEntities; } var userInfoList = from u in db.UserInfo where u.ID == 343 select new{UName=u.UserName,UPwd=u.UserPass}; //新建一個匿名類查詢 foreach (var userInfo in userInfoList) { Response.Write(userInfo.UName+":"+userInfo.UPwd); } } /// <summary> /// 匿名函數來查詢 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Button2_Click(object sender, EventArgs e) { // Func<UserInfo, bool> whereLambda = u => { return u.ID == 343; }; EFFristModelEntities db = new EFFristModelEntities(); //var userInfoList = db.UserInfo.Where<UserInfo>(u=>u.ID==3); //select * from UserInfo where id=343 //升序排序 //var userInfoList = db.UserInfo.Where<UserInfo>(U => true).OrderBy<UserInfo, int>(u => u.ID); //降序排序 //var userInfoList = db.UserInfo.Where<UserInfo>(U => true).OrderByDescending(u => u.ID); int pageIndex = 2; int pageSize = 2; var userInfoList = (from u in db.UserInfo where u.ID > 0 orderby u.RegTime ascending, u.ID descending select u).Skip<UserInfo>((pageIndex - 1) * pageSize).Take<UserInfo>(pageSize); // var userInfoList = db.UserInfo.Where<UserInfo>(U => true).OrderByDescending(u => u.UserPass).ThenByDescending<UserInfo, int>(u => u.ID);//Skip:表示跳過多少條記錄, Take取多少條記錄 foreach (var userInfo in userInfoList) { Response.Write(userInfo.UserName + "<br/>"); } } protected void Button3_Click(object sender, EventArgs e) { string str ="ttttt"; Response.Write (str.MyStr()); } protected void Button4_Click(object sender, EventArgs e) { EFFristModelEntities db = new EFFristModelEntities(); var userInfoList = db.UserInfo.Where<UserInfo>(u => u.ID >0); int i = 0; int count = userInfoList.Count(); Response.Write(count); } } }
以上就是EF創建和操作的詳細介紹,歡迎評論和留言
