4

在 MVC 3 中是否可以在调用 DbContext.SaveChanges() 后回滚数据库?

我的实体类:

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

我要做的是将 ImageFile 记录插入数据库,然后使用自动递增的 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.
4

2 回答 2

2

您应该将您的数据库事务包装DbContext在一个数据库事务中,使用 aTransactionScope或创建在事务中运行的DbContextusing a DbConnection

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();
    }        
}
于 2011-12-28T12:10:58.073 回答
0

基本上,.saveChanges() 你的承诺。如果你想回滚,不要做 a.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()函数,并没有太大区别。

于 2011-12-28T12:16:18.180 回答