EntityFramework用法探索(八)事務處理


使用前文中描述的Retail示例,在Customer對象的Mapping中設置Name屬性:

1       this.Property(t => t.Name)
2           .IsRequired()
3           .HasMaxLength(256);

要求該屬性不能為空,並且長度不超過256。

我們構造一個有效的Customer對象,再構造一個無效的Name屬性為空的對象。

 1       DomainModels.Customer customer1 = new DomainModels.Customer()
 2       {
 3         Name = "Dennis Gao",
 4         Address = "Beijing",
 5         Phone = "18888888888",
 6       };
 7       DomainModels.Customer customer2 = new DomainModels.Customer()
 8       {
 9         //Name = "Degang Guo", // 創造一個無效的對象,此處客戶名稱不能為空
10         Address = "Beijing",
11         Phone = "16666666666",
12       };

我們使用如下代碼添加Customer對象數據到數據庫中,

 1       Customer entity1 = Mapper.Map<DomainModels.Customer, Customer>(customer1);
 2       Customer entity2 = Mapper.Map<DomainModels.Customer, Customer>(customer2);
 3 
 4       using (RetailEntities context = new RetailEntities())
 5       {
 6         context.Customers.Add(entity1);
 7         context.Customers.Add(entity2);
 8         context.SaveChanges(); // 提交時將拋出異常
 9 
10         customer1.Id = entity1.Id;
11         customer2.Id = entity2.Id;
12       }
13 
14       Console.WriteLine(customer1);
15       Console.WriteLine(customer2);

得到結果:

EntityFramework已經明確的告訴我們某Entity驗證失敗。此時查詢數據庫,兩條記錄均不存在。EntityFramework自帶的事務已經幫助回滾了操作。

現在我們修改下程序,改為提交兩次:

 1       try
 2       {
 3         using (RetailEntities context = new RetailEntities())
 4         {
 5           context.Customers.Add(entity1);
 6           context.SaveChanges(); // 順利執行
 7           context.Customers.Add(entity2);
 8           context.SaveChanges(); // 提交時將拋出異常
 9 
10           customer1.Id = entity1.Id;
11           customer2.Id = entity2.Id;
12         }
13       }
14       catch (Exception ex)
15       {
16         Console.WriteLine(FlattenException(ex));
17       }

此時得到結果:

通過查詢,可以確定,第一條數據已經被成功保存。

然后我們修改代碼,增加TransactionScope,

 1         using (var transactionScope = new TransactionScope(
 2           TransactionScopeOption.RequiresNew))
 3         {
 4           Customer entity1 = Mapper.Map<DomainModels.Customer, Customer>(customer1);
 5           Customer entity2 = Mapper.Map<DomainModels.Customer, Customer>(customer2);
 6 
 7           using (RetailEntities context = new RetailEntities())
 8           {
 9             context.Customers.Add(entity1);
10             context.SaveChanges(); // 順利提交
11             context.Customers.Add(entity2);
12             context.SaveChanges(); // 提交時將拋出異常
13 
14             customer1.Id = entity1.Id;
15             customer2.Id = entity2.Id;
16           }
17 
18           transactionScope.Complete();
19         }
20       }
21       catch (Exception ex)
22       {
23         Console.WriteLine(FlattenException(ex));
24       }

此時,仍然在第二個SaveChanges()處拋出異常,但第一個SaveChanges()的提交也被回滾了。

證明事務Scope起到了作用。

完整代碼和索引

EntityFramework用法探索系列

完整代碼下載


免責聲明!

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



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