1、新建一個頁面,為其添加一個Button按鈕,當點擊Button的時候,添加數據到數據庫。
2、先看一下右邊的Model1.Context.cs文件。 從下圖可以看出里面有一個 EFEntities類繼承自DbContext,繼承父類的時候要為其傳入參數 name=EFEntities,其中 name=EFEntities是連接數據庫的語句。
1 //------------------------------------------------------------------------------ 2 // <auto-generated> 3 // 此代碼已從模板生成。 4 // 5 // 手動更改此文件可能導致應用程序出現意外的行為。 6 // 如果重新生成代碼,將覆蓋對此文件的手動更改。 7 // </auto-generated> 8 //------------------------------------------------------------------------------ 9 10 namespace EFTest 11 { 12 using System; 13 using System.Data.Entity; 14 using System.Data.Entity.Infrastructure; 15 16 public partial class EFEntities : DbContext 17 { 18 public EFEntities(): base("name=EFEntities") 19 { 20 } 21 22 protected override void OnModelCreating(DbModelBuilder modelBuilder) 23 { 24 throw new UnintentionalCodeFirstException(); 25 } 26 //Dbset表示可以對UserInfo實體類進行一系列的操作。 27 public virtual DbSet<UserInfo> UserInfo { get; set; } 28 } 29 }
3、點擊按鈕的時候插入數據。
1 protected void Add_Click(object sender, EventArgs e) 2 { 3 UserInfo userInfo = new UserInfo(); 4 userInfo.UserName = "謝尊旭"; 5 userInfo.UserPassword = "123456"; 6 userInfo.UserEmail = "1227111748@qq.com"; 7 //EFEntities 可以理解成EF的上下文數據操作類,負責與數據庫打交道。 8 EFEntities db = new EFEntities(); 9 //將數據添加到EF,並且標記為添加標記,返回受影響的行數。 10 db.UserInfo.Add(userInfo); 11 //SaveChanges()數據保存到數據庫,根據前面的標記生成對應的Sql語句,交給數據庫執行。 12 db.SaveChanges(); 13 }
4、為屬性賦值的原理。
執行順序:應用程序構建好數據后交給DbContext,DbContext要讀取Xml中的文件,找到實體和表之間映射關系,生成相應的sql語句,把生成sql語句交給DataBase執行。
5、EF查詢數據。
1 protected void Select_Click(object sender, EventArgs e) 2 { 3 //實例化EFEntities類。 4 EFEntities db = new EFEntities(); 5 //查詢的時候使用的是linq語句。查詢UserId=15。 6 //IQueryable<UserInfo> userInfo = from u in db.UserInfo; 7 //通過下面這句返回的是IQueryable<UserInfo>類型,而不是一個單純的UserInfo類型,切記。一般都用推斷了。 8 var userInfoList = from u in db.UserInfo 9 where u.UserId == 15 10 select u; 11 //EF特點:延遲加載機制。就是數據用到的時候才去數據庫中查取,不用的時候就不查詢。 12 //就是只有走到循環遍歷中的in userInfoList的時候,才開始去數據庫中查數據。 13 foreach (var userInfo in userInfoList) //這個時候userInfo類型是UserInfo了,但這里還是用推斷了。 14 { 15 Response.Write(userInfo.UserName); 16 } 17 //linq語句的語法和sql語句執行的順序差不多。 18 //讓上面的linq語句變成sql語句為:select * from UserInfo where UserId =15 19 //Sql語句執行的順序是:from UserInfo 20 // where UserId=15 21 // select * 22 }
6、EF刪除數據。
1 protected void Remove_Click(object sender, EventArgs e) 2 { 3 EFEntities db = new EFEntities(); 4 var userInfoList = from u in db.UserInfo 5 where u.UserId == 15 6 select u; 7 //FirstOrDefault()返回序列中的第1個元素,如果序列中不包含任何元素,則返回默認值,默認值為null。 8 //First()返回序列中的第一個元素。如果根據條件去查數據,如果沒找到,用First()會拋異常。 9 //SingleOrDefault()返回序列中的唯一元素,如果該序列為空,則返回默認值,如果包含多個元素,此方法則引出異常。 11 UserInfo userInfo = userInfoList.FirstOrDefault(); 12 if (userInfo != null) 13 { 14 //db.UserInfo.Remove(userInfo); 15 //還可以用這種方法打一個刪除標記。 16 db.Entry<UserInfo>(userInfo).State = System.Data.Entity.EntityState.Deleted; 17 db.SaveChanges(); 18 Response.Write("刪除成功"); 19 } 20 else 21 { 22 Response.Write("刪除失敗"); 23 } 24 }
7、EF刪除數據2,Remove() 和Entity之間的區別。
1 protected void Remove2_Click(object sender, EventArgs e) 2 { 3 EFEntities db = new EFEntities(); 4 UserInfo userInfo = new UserInfo() { UserId = 13 }; 5 //這個時候如果用 db.UserInfo.Remove(userInfo)就會拋出異常。 6 //db.UserInfo.Remove(userInfo); 7 //這句話的意思是讓EF操作類先找到這個對象,然后加上刪除標記。 8 db.Entry<UserInfo>(userInfo).State = System.Data.Entity.EntityState.Deleted; 9 db.SaveChanges(); 10 }
8、更新數據。
protected void Update_Click(object sender, EventArgs e) { EFEntities db = new EFEntities(); //先查詢要獲取的對象。 var userInfo = from u in db.UserInfo where u.UserId == 12 select u; //得到具體對象。 var userInfo2 = userInfo.FirstOrDefault(); //修改密碼。 userInfo2.UserPassword = "AAAAAAA"; //指定狀態。 db.Entry<UserInfo>(userInfo2).State = System.Data.Entity.EntityState.Modified; db.SaveChanges(); Response.Write("修改成功"); }
End。