2011-12-28 2 views
4
MVC 3에서

은 DbContext.SaveChanges()를 호출 한 후 데이터베이스를 롤백 할 수 있습니까?.NET MVC 3 Dbcontext에서 롤백

내 엔티티 클래스 :

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

난 할 노력하고있어, 다음 이미지의 파일 이름으로 자동 증가 ID를 사용하여 DB를에 ImageFile의 레코드를 삽입 어딘가로 이미지 파일을 저장할 수있다 그밖에. System.IO가 실패하면 데이터베이스를 롤백하고 싶습니다.

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

guid를 파일 이름으로 사용하고 db에 별도의 열로 추가하는 이유는 무엇입니까? 먼저 파일을 저장하고 db를 행에 삽입하는 것보다 낫습니다. 트랜잭션이 필요 없습니다. try/catch. – 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

자동 증가 ID를 얻으려면 .SaveChanges()가 필요합니다. –

+2

무엇이 잘못 되었습니까 (db.myTable.Select (x => x.Id) .Max()) + 1? :) – Flater

+0

"가장 큰 ID"이며 "마지막 자동 증가 ID"와 다릅니다 –