Asp.net mvc 3 Dbcontext中的.NET MVC 3回滚

Asp.net mvc 3 Dbcontext中的.NET MVC 3回滚,asp.net-mvc-3,entity-framework,transactions,dbcontext,Asp.net Mvc 3,Entity Framework,Transactions,Dbcontext,在MVC 3中,调用DbContext.SaveChanges()后是否可以回滚数据库 我的实体类: public class BipEntities : DbContext { public DbSet<Page> Pages { get; set; } public DbSet<ImageFile> ImageFiles { get; set; } } 但是,上面的代码给出了以下错误消息: EntityConnection can only be c

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

我的实体类:

public class BipEntities : DbContext
{
    public DbSet<Page> Pages { get; set; }
    public DbSet<ImageFile> ImageFiles { get; set; }
}
但是,上面的代码给出了以下错误消息:

EntityConnection can only be constructed with a closed DbConnection.

您应该使用
TransactionScope
或使用在事务内部运行的
DbConnection
创建
DbContext
在数据库事务中包装
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();
    }        
}

基本上,
.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()
函数,没有多大区别。

为什么不使用guid作为文件名,并将其作为单独的列添加到数据库中,然后首先保存文件,然后在数据库中插入行。不需要事务,只需try/catch即可。@frennky,谢谢你的建议,但我还是想找到答案:)我需要.SaveChanges()来获取自动递增的id。这是“最大的id”,它不同于“上次自动递增的id”。你可以在查询中使用函数“select Last_insert_id()”来获取上次创建的id,但您需要确保在相同的数据库上下文中执行此操作。我想这正是我想要的,谢谢:)
using(var db = new dbconnection())
{
    myEntity item = new myEntity { Name = "Hello" };

    db.tblofmyEntities.AddObject(item);

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

}