2011-12-28 10 views
4
MVC 3で

は、DbContext.SaveChanges()を呼び出した後にデータベースをロールバックすることは可能ですか?.NET MVC 3 Dbcontextでのロールバック

私のエンティティクラス:私は何をしようとしているが、その後、画像のファイル名として自動インクリメントされたIDを使用して、DBに画像ファイルのレコードを挿入どこかに画像ファイルを保存している

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

else。 System.IOが失敗すると、データベースをロールバックします。

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

guidをファイル名として使用して、そのファイルを別の列として追加するのは、最初にファイルを保存してからdbを行に挿入するよりも簡単です。トランザクションは必要ありません。試してみてください。 – frennky

+0

@frennky、提案のおかげで、私はとにかく答えを見つけたいと思っています:) –

答えて

2

あなたは、データベースのトランザクションであなたのDbContextをラップする必要があり、どちらかTransactionScopeを使用して、または内で実行されますDbConnectionを使用してDbContextを作成:

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(); 

ただし、上記のコードは私に、このエラーメッセージを表示しますトランザクション:

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

私はこれが私が欲しかったものですね、ありがとう:) –

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を取得する必要があります。 –

+2

何が問題なのですか(db.myTable.Select(x => x.Id).Max())+ 1? :) – Flater

+0

これは「最大のID」で、「最後の自動インクリメントID」とは異なります –

関連する問題