EntityFramework进阶——事务
事務(wù)處理
EF支持事務(wù)處理操作,以下語(yǔ)句會(huì)獲取當(dāng)前DbContext對(duì)象專用的DbContextTransaction事務(wù)處理的對(duì)象:
DbContextTransaction transaction = context.Database.BeginTransaction()獲取transaction之后,期間任何與context有關(guān)的數(shù)據(jù)均會(huì)被納入此事務(wù)處理的范圍。
調(diào)用transaction.Commit方法即可完成事務(wù)處理,若要放棄事務(wù)處理,調(diào)用transaction.Rollback方法即可,以下列舉相關(guān)語(yǔ)句:
using(var transaction = context.Database.BeginTransaction) {//事務(wù)處理操作 }using語(yǔ)句是建立事務(wù)處理的常見語(yǔ)句,在結(jié)構(gòu)上也比較容易理解,一旦using語(yǔ)句結(jié)束,transaction對(duì)象便自動(dòng)調(diào)用Dispose回收事務(wù)處理對(duì)象。
下面通過一段示例代碼來(lái)說(shuō)明:
假設(shè)存在如下圖實(shí)體類:
public class Product{public int Id { get; set; }public string Name { get; set; }public int Price { get; set; }public int SPrice { get; set; }}編寫一段事務(wù)代碼如下圖所示:
static void Main(string[] args) {using (KTStoreModel context = new KTStoreModel()){using (var transaction = context.Database.BeginTransaction()){try{var products = context.Product;foreach (Product product in products){int p = (int)(product.Price * 0.5);product.SPrice = p;}int c = context.SaveChanges();transaction.Commit();Console.WriteLine("更新了{(lán)0}項(xiàng)數(shù)據(jù)",c);}catch(Exception ex){transaction.Rollback();Console.WriteLine("事務(wù)處理失敗");}}} }?
共享事務(wù)處理連接?
?不同的context對(duì)象可以通過共享連接將數(shù)據(jù)的更新操作合并在相同的事務(wù)處理范圍中,參考以下的設(shè)置:
KTStoreContext context_s = new kTStoreContext (context.Database.Connection,contextOwnsConnection:false )為了共享事務(wù)處理,因此調(diào)用另一個(gè)版本的構(gòu)造函數(shù)創(chuàng)建所需的context對(duì)象:除此之外,還要指定使用此連接的事務(wù)處理環(huán)境。
context_s.Database.UseTransaction(transaction.UnderlyingTransaction);完成以上設(shè)置,context與context_s就會(huì)同時(shí)被限定在同一個(gè)事務(wù)處理范圍中。?
?列舉如下一個(gè)代碼例子:
首先需要新增上下文類中的構(gòu)造函數(shù):
public class ConcurrencyCheckModel : DbContext {public ConcurrencyCheckModel(): base("name=ConcurrencyCheckModel"){}public ConcurrencyCheckModel(DbConnection conn, bool contextOwnsConnection) : base(conn, contextOwnsConnection)//新增構(gòu)造函數(shù){}public virtual DbSet<Product> Product { get; set; } } static void Main(string[] args) {using (ConcurrencyCheckModel context = new ConcurrencyCheckModel()){using (var transaction = context.Database.BeginTransaction()){try{var products = context.Product;foreach (Product product in products){int p = (int)(product.Price * 0.5);product.SPrice = p;}int c = context.SaveChanges();ConcurrencyCheckModel context_s = new ConcurrencyCheckModel(context.Database.Connection, contextOwnsConnection: false);context_s.Database.UseTransaction(transaction.UnderlyingTransaction);context_s.Database.ExecuteSqlCommand("Update product set SPrice = 0 Where Id = 10");transaction.Commit();Console.WriteLine("更新了{(lán)0}項(xiàng)數(shù)據(jù)",c);}catch (Exception ex){transaction.Rollback();Console.WriteLine("處理事務(wù)失敗:{0}",ex.ToString());}}} }?
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的EntityFramework进阶——事务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Metrics_collector还没有
- 下一篇: 面试题:谈谈你对TCP的认识