DataContext等一些封装好的EF,我遇到这样一个问题,在调用SaveChanges()的时候,报错:在提供程序连接上启动事务时出错
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Entity; using System.Data.Entity.Infrastructure; using Domain.Entity; namespace Infrastructure.Data.Uow { public partial class UnitOfWorkContext : DbContext, UnitOfWorkIQueryable { public void Commit() { try { base.SaveChanges(); } catch (Exception ex) { Infrastructure.Data.Uow.Log.LoggerRepositoryManager.AddLogInfo(1, 0, string.Empty, string.Empty, "commit data error " + ex.Message, ex.InnerException != null ? ex.InnerException.Message : string.Empty, string.Empty); } } public void Refresh() { bool saveFailed = false; do { try { base.SaveChanges(); } catch (DbUpdateConcurrencyException ex) { Infrastructure.Data.Uow.Log.LoggerRepositoryManager.AddLogInfo(1, 0, string.Empty, string.Empty, "commit data and refresh data error " + ex.Message, ex.InnerException != null ? ex.InnerException.Message : string.Empty, string.Empty); saveFailed = true; ex.Entries.ToList() .ForEach(entry => { entry.OriginalValues.SetValues(entry.GetDatabaseValues()); }); } } while (saveFailed); } public void Rollback() { base.ChangeTracker.Entries().ToList().ForEach(entry => entry.State = System.Data.EntityState.Unchanged); Infrastructure.Data.Uow.Log.LoggerRepositoryManager.AddLogInfo(1, 0, string.Empty, string.Empty, "rollback data", string.Empty, string.Empty); } #region UnitOfWorkIQueryable public IDbSet<T> SetEntity<T>() where T : Domain.Entity.EntityBase { return base.Set<T>(); } public IEnumerable<TEntity> ExecuteQuery<TEntity>(string sqlQuery, params object[] parameters) { Infrastructure.Data.Uow.Log.LoggerRepositoryManager.AddLogInfo(1, 0, string.Empty, string.Empty, "execute query", "execute query " + sqlQuery, string.Empty); return base.Database.SqlQuery<TEntity>(sqlQuery, parameters); } public int ExecuteCommand(string sqlCommand, params object[] parameters) { Infrastructure.Data.Uow.Log.LoggerRepositoryManager.AddLogInfo(1, 0, string.Empty, string.Empty, "execute command", "execute command " + sqlCommand, string.Empty); return base.Database.ExecuteSqlCommand(sqlCommand, parameters); } #endregion } }
View Code
> Infrastructure.Data.Uow.dll!Infrastructure.Data.Uow.UnitOfWorkContext.Commit() 行 22 C#
我查了google,里面有说使用Refresh()这个方法,把Datacontext里面的给替换,但是,这个是封装的EF,我不知道怎么去调用这个方法
不允许启动新事务,因为有其他现成正在该回话中运行.
你应该是把EF上下文弄成全局共享的了.有其他现成正在同一个回话里执行SQL
DbContext是封装好的,我不知道怎么去设置
问题中,我补充了东西,你可以看下
@魔女小溪: 你 EfRepository(UnitOfWorkIQueryable unitOfWork) 构造函数传入的对象至少得是线程单例的.
不能是全局的
@吴瑞祥: 我能说句欠揍的话吗?这个我还真是不懂,请问一下怎么修改?
@魔女小溪: 你把实例化EfRepository对象的代码发上来看看
@吴瑞祥:
private static void Repository(Autofac.ContainerBuilder builder)
{
#region repository
builder.RegisterGeneric(typeof(EfRepository<>)).As(typeof(IRepository<>)).InstancePerHttpRequest();
#endregion
}
用的是ioc依赖注入模式
@魔女小溪: 都没看见他构造函数是怎么传参的,Autofac我也没用过,不太知道.
不是自己做的话就去问下做的人,问他这个项目里EF上下文是怎么管理的.
@吴瑞祥: 可悲的是,做这个项目的人,早就走了,而且我都没见过这个人,之前接手这个项目的人,也不是开发这个项目的人,而且他也走的快,所以,我还没来得急问呢!哎,我一个人负责3个项目,真是有够晕的。。。
@魔女小溪: 你看下项目配置文件里Autofac的配置吧,
报错的堆栈信息发粗来
不发那我走了
@刘小猪: 晕啊 你的两次回复相差7秒 谁能反应这么快
等下呀,我刚刚吃汤圆去了,等等。。。拜托了啦
@组织万岁: 7分钟啊。。。
@魔女小溪: 这个不是ef报问题 你是代码里面事务用多了的问题 提示已经说了
@刘小猪: 我给你看下代码
@刘小猪:
//更新PicInfo
data.Name = newName;
data.Remark = Path.GetFileNameWithoutExtension(sourceFileName);
data.SourceName = sourceFileName;
var webFullPath1 = mapPath.Substring(1) + newName;
data.WebFullPath = webFullPath1;
picInfoService.Modify(data, this.WorkContext.CurrentUser);
public bool Modify(Domain.Entity.PicInfo modify, Domain.Entity.User operUser)
{
var res = false;
try
{
picInfoRepository.Modify(modify);
picInfoRepository.Uow.Commit();
res = true;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
return res;
}
@魔女小溪: 有意思 领域驱动? 你这项目有多大 这里面看不到那写了事务
@刘小猪: 本来就已经封装好了,我也是刚刚接手这个项目,对于EF还不懂,我问题里面有补充的
@魔女小溪: 你找找在哪用了事务就行了
@刘小猪:没看到呀。。呜呜呜
不懂。 帮顶
不过, 重启sql试试。