Asp.net mvc 3 Dbcontext中的.NET MVC 3回滚
在MVC 3中,调用DbContext.SaveChanges()后是否可以回滚数据库 我的实体类: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
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();
}