2011-12-28 71 views
4

是否有可能在調用DbContext.SaveChanges()之後回滾數據庫?在MVC 3中的.NET MVC 3在Dbcontext中回滾

我的實體類:

public class BipEntities : DbContext 
{ 
    public DbSet<Page> Pages { get; set; } 
    public DbSet<ImageFile> ImageFiles { get; set; } 
} 

我試圖做的是插入一個鏡像文件記錄到數據庫,然後使用自動遞增的ID作爲圖像文件名,圖像文件保存到某個地方其他。 當System.IO失敗時,我想回滾數據庫。

BipEntities db = new BipEntities(); 
db.Database.Connection.Open(); 
DbTransaction tranx = db.Database.Connection.BeginTransaction(); 

ImageFile img = new ImageFile { CreatedAt = DateTime.Now }; 
db.ImageFiles.Add(img); 
db.SaveChanges(); 

string filename = "img" + img.Id.ToString() + ".png"; 
try { 
    //Works on system IO to process file 
    tranx.Commit(); 

} Catch (Exception) { 
    tranx.Rollback(); 
} 

db.Database.Connection.Close(); 

然而,上面的代碼給了我此錯誤消息:

EntityConnection can only be constructed with a closed DbConnection. 
+1

爲什麼不使用guid作爲文件名,並將其作爲分隔列添加到數據庫中,而不是先保存文件並將其插入數據庫中。沒有必要進行交易,只需嘗試/趕上。 – frennky 2011-12-28 12:13:46

+0

@frennky,感謝您的建議,但我想找出答案無論如何:) – 2011-12-28 12:54:35

回答

2

你應該換你DbContext在一個數據庫事務,或者使用一個TransactionScope或者使用內部運行的DbConnection創建DbContext交易:

using (var con = new SqlConnection(conStr)) 
{ 
    con.Open(); 
    using (var tran = con.BeginTransaction()) 
    { 
     var img = new Image(); 

     using (var db = new BipEntities(con)) 
     { 
      db.Images.AddObject(img); 

      db.SaveChanges(); 
     } 

     // Write to disk here. 
     WriteStuffToDisk(stuff, img.Id); 

     tran.Commit(); 
    }   
} 
+0

我想這就是我想要的,謝謝:) – 2011-12-28 12:54:56

0

基本上,.saveChanges()你的提交。如果您想要回滾,只需不要執行.saveChanges並關閉數據庫訪問層,不會保存更改。

using(var db = new dbconnection()) 
{ 
    myEntity item = new myEntity { Name = "Hello" }; 

    db.tblofmyEntities.AddObject(item); 

    if (item.Name != "FOO") 
     db.SaveChanges(); 

} 

該項目將被保存,因爲它的名稱不是「FOO」。如果是「FOO」,則不會被保存。當應用程序到達}因此沒有項目將被保存。您可以在if塊之前或之內調用.AddObject()函數,但沒有太大區別。

+0

我需要.SaveChanges()來獲得自動遞增的ID。 – 2011-12-28 12:35:58

+2

(db.myTable.Select(x => x.Id).Max())+ 1出了什麼問題? :) – Flater 2011-12-28 12:41:56

+0

這是「最大的ID」,它不同於「最後一個自動遞增的ID」 – 2011-12-28 12:50:27