使用EntityFramework6完成增刪查改和事務


使用EntityFramework6完成增刪查改和事務

上一節我們已經學習了如何使用EF連接數據庫,並簡單演示了一下如何使用EF6對數據庫進行操作,這一節我來詳細講解一下。

使用EF對數據庫進行操作,整個過程就像操作數組一樣,我們只管修改或向集合中添加值,最后通知EF保存修改后的結果就可以了。

准備工作

為了演示,我在數據庫中建了兩張表。class表用於表示班級,class_id是班級編號,class_name是班級名稱。第二張表是學生表studentstudent_id為學生編號,name為姓名,age為年齡,class_id是學生所屬班級,student表中的class_id與class表中的class_id存在外聯關系

數據結構關系圖

數據庫建好后,按照上一節介紹的步驟我們直接通過向導來生成EF代碼。

執行完成后VS為我們生成了三個類,分別是DBModel_classstudent,其中DBModel代表的是數據庫,而_classstudent則分別代表班級表和學生表。

先來看看DBModel類,DBModel相當於一個數據庫,之后你new一個DBModel就相當於打開了一次數據庫,跟數據庫建立了一次連接。

再來看看student與_class類。類中的屬性上添加很多特性(Attribute),用於描述數據約束。值得注意的是在student類中,EF將我們的外鍵class_id分解成了兩個屬性,其中_class前面使用了virtual關鍵字,使用了virtual關鍵字描述的屬性在查詢時並不會馬上從數據庫中讀取數據,而是當你真正需要用到它的值時再單獨從數據庫中查詢出來。

student
class

使用EF讀取數據

我先在學生表中添加了一些數據。

接下來讓我們使用EF來查詢年齡大於10歲的同學的學號、姓名、年齡、班級名稱。

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. using (var db = new DBModel())
  6. {
  7. var result = from i in db.students //使用LINQ查詢年齡大於10歲的學生
  8. where i.age > 10
  9. select i;
  10. foreach (var student in result)
  11. {
  12. Console.WriteLine("學號:" + student.Student_id + " 姓名:" + student.name
  13. + " 年齡:" + student.age + " 班級名稱:" + student._class.class_name);
  14. }
  15. Console.Read();
  16. }
  17. }
  18. }

其中使用了LINQ,對LINQ不熟的可以看看這篇文章

使用EF添加數據

向數據庫中添加數據就跟往List<>集合添加數據一樣,不過最后需要調用SaveChanges()向數據庫保存一下數據。

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. using (var db = new DBModel())
  6. {
  7. var s = new student();
  8. //因為數據庫中的student_id是自動增長的所以可以不用賦值
  9. s.name = "張三";
  10. s.age = 15;
  11. s.class_id = 1;
  12. db.students.Add(s);
  13. db.SaveChanges(); //將修改保存到數據庫中
  14. }
  15. }
  16. }

使用EF修改數據

先查詢出你要修改的那條數據,之后直接更改其中的值就可以了。

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. using (var db = new DBModel())
  6. {
  7. var student = db.students.FirstOrDefault(s => s.name == "蘿莉");
  8. student.age = 13; //將蘿莉的年齡改為13歲
  9. db.SaveChanges();
  10. }
  11. }
  12. }

使用EF刪除數據

使用EF刪除數據就和在List<>集合中刪除元素一樣

使用TransactionScope
  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. using (var db = new DBModel())
  6. {
  7. var student = db.students.FirstOrDefault(s => s.name == "蘿莉"); //查找蘿莉
  8. db.students.Remove(student); //刪除蘿莉
  9. db.SaveChanges();
  10. }
  11. }
  12. }

在EF使用事務

事務就是確保一次數據庫操作,所有步驟都成功,如果哪一步出錯了,整個操作都將回滾。

在EF使用事務有兩種方案,一種是EF自帶的.BeginTransaction()方法,另一種是使用TransactionScope類。

使用.BeginTransaction()

使用.BeginTransaction()實現事務
  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. using (var db = new DBModel())
  6. {
  7. var tran = db.Database.BeginTransaction(); //開啟事務
  8. try
  9. {
  10. var student = db.students.FirstOrDefault(s => s.name == "蘿莉");
  11. db.students.Remove(student); //刪除蘿莉
  12. db.SaveChanges();
  13. tran.Commit(); //必須調用Commit(),不然數據不會保存
  14. }
  15. catch (Exception ex)
  16. {
  17. tran.Rollback(); //出錯就回滾
  18. }
  19. }
  20. }
  21. }

使用TransactionScope

使用之前記得引入System.Transactions.dll

使用TransactionScope
  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. using (var db = new DBModel())
  6. {
  7. using (var tran = new TransactionScope()) //開啟事務
  8. {
  9. var student = db.students.FirstOrDefault(s => s.name == "蘿莉");
  10. db.students.Remove(student); //刪除蘿莉
  11. db.SaveChanges();
  12. tran.Complete(); //必須調用.Complete(),不然數據不會保存
  13. } //出了using代碼塊如果還沒調用Complete(),所有操作就會自動回滾
  14. }
  15. }
  16. }

兩種都可以,不過我覺得使用TransactionScope要方便一點。

到此使用EF6實現CRUD以及事務就介紹完了,下一節我們再來討論一下如何在EF執行SQL,以實現更加靈活的數據操作。

目錄:EntityFramework6 快速入門教程

下一節:在EntityFramework6中執行SQL語句


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM