Откат .NET MVC 3 в Dbcontext - PullRequest
       17

Откат .NET MVC 3 в Dbcontext

4 голосов
/ 28 декабря 2011

в MVC 3 возможно ли откатить базу данных после вызова DbContext.SaveChanges ()?

Мой класс сущностей:

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

Что я пытаюсь сделать, это вставитьЗапись ImageFile в базу данных, затем, используя автоматически увеличенный идентификатор в качестве имени файла изображения, сохраните файл изображения в другом месте.Когда происходит сбой 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.

Ответы [ 2 ]

2 голосов
/ 28 декабря 2011

Вы должны заключить свой DbContext в транзакцию базы данных, используя TransactionScope или создав DbContext, используя 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();
    }        
}
0 голосов
/ 28 декабря 2011

По сути, .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», он не будет сохранен.Когда приложение достигает }, то ни один элемент не будет сохранен.Вы можете вызвать функцию .AddObject() до или внутри блока if, без особой разницы.

...