使用前文中描述的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用法探索系列
