如题,DbContext在SaveChanges()之后会将结果提交到数据库。
但因为项目过程中业务的特殊性(先不考虑场景的合理性,咱们只看这个问题),需要在一个上下文中多次SaveChanges,但直到最后再提交数据库。
怎样设置SaveChanges的时候不提交数据库呢?
在以往ObjectContext中可以使用
context.Connection.Open();
System.Data.Common.DbTransaction tran = context.Connection.BeginTransaction();
最后tran.Commit();或tran.Rollback();来实现,但在DbContext中使用相同方式则抛出异常
"如果分配给命令的连接位于本地挂起事务中,ExecuteReader 要求命令拥有事务。命令的 Transaction 属性尚未初始化。"
简而言之,如何使用DbContext实现,一个事务中update多次,最后一次性commit或Rollback。请各路达人指教。
http://blog.csdn.net/yanwushu/article/details/10307801
试试这个,用事务。
如果分配给命令的连接位于本地挂起事务中,ExecuteReader 要求命令拥有事务。命令的 Transaction 属性尚未初始化。
你出现这个错误,肯定是没有实例化这个对象。或者实例化错了这个对象。
首先添加引用程序集System.Transactions
然后在你要实例化的地方引用这个!
谢谢,TransactionScope知道的,但用了以后就变成分布式事物的方式了,虽然实际上不会启动分布式事务,但还是想用其他方式
DbContext dcCtx = new DbContext;
// 随便修改,修改多少次都行。
dbCtx.SaveChanges(); // 只保存一次
我想请教大家的是
using(DbContext ctx = new DbContext())
{
do something;
ctx.saveChanges();//保存结果,但未提交数据库
do another things;
ctx.saveChanges();//保存结果,但未提交数据库
//提交数据库
}
该怎么做?
简而言之,如何使用DbContext实现,一个事务中update多次,最后一次性commit或Rollback
@Greatcqi: 我先问你一个问题,你想要的结果是不是这样:
using(DbContext ctx = new DbContext())
{
A a = new A(){Id = 1};
ctx.DbSet<A>.Add(a); // 保存结果了,在当前上下文中,但未提交数据库
}
using(DbContext ctx = new DbContext())
{
Assert(ctx.DbSet<A>.Contans(o->o.Id == 1)); // 在其它上下文中保存的结果,虽然没提交到数据库,但是在这里也应该能查询到。
}
问题只有一个.你让EF怎么判定你的"直到最后"是什么时候
范围在
using(DbContext ctx = new DbContext())
{
}
之内
@Greatcqi: 如果一个默认不提交就是回滚事务.
这种情况你怎么办
@吴瑞祥: 不知道您看清问题没有
在以往ObjectContext中可以使用
context.Connection.Open();
System.Data.Common.DbTransaction tran = context.Connection.BeginTransaction();
最后tran.Commit();或tran.Rollback();
在ObjectContext中,这样可以实现最后统一回滚或提交
重写SaveChanges,代码就是Do nothing。
我只能说你的逻辑除了点问题,导致你需要通过解决SaveChanges()的问题,还是好好解决逻辑问题吧
问题里就说了,不考虑业务逻辑如何。纯粹的向大家请教技术问题。你这样的回答毫无意义
var objectContext = ((IObjectContextAdapter) _dataContext).ObjectContext; if (objectContext .Connection.State != ConnectionState.Open) { objectContext .Connection.Open(); } var transaction = objectContext .Connection.BeginTransaction();
楼主,这样写试试
ObjectContext没有问题。我的问题是上下文范围是
using(DbContext ctx = new DbContext())
{
}
实际上已经超出上下文范围了,每次using 都是不同的对象 怎么来最后 savechanges?
老老实实用事务包裹吧,要么就全局dbcontext
我想请教大家的是
using(DbContext ctx = new DbContext())
{
do something;
ctx.saveChanges();//保存结果,但未提交数据库
do another things;
ctx.saveChanges();//保存结果,但未提交数据库
//提交数据库
}
该怎么做?
@Greatcqi: 既要写savechanges,然后又不让人家去提交数据库。。。 在最后savechanges就行了啦。。。
其实在insert外键表的时候 是必须先提交后才能写关联数据的,所以没法在最后savechanges
另外:你这个保存结果是个什么意思?保存在内存中? 试试 db.Entry(xx entity).State = EntityState.Modified,将实体标记为已修改 savechanges时才执行