首页 新闻 搜索 专区 学院

EF中的错误,在提供程序连接上启动事务时出错

0
悬赏园豆:5 [已解决问题] 解决于 2014-02-18 14:53

DataContext等一些封装好的EF,我遇到这样一个问题,在调用SaveChanges()的时候,报错:在提供程序连接上启动事务时出错

EF
问题补充:
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

 

View Code

 

> Infrastructure.Data.Uow.dll!Infrastructure.Data.Uow.UnitOfWorkContext.Commit() 行 22 C#

我查了google,里面有说使用Refresh()这个方法,把Datacontext里面的给替换,但是,这个是封装的EF,我不知道怎么去调用这个方法

魔女小溪的主页 魔女小溪 | 初学一级 | 园豆:38
提问于:2014-02-14 14:03
< >
分享
最佳答案
0

不允许启动新事务,因为有其他现成正在该回话中运行.

你应该是把EF上下文弄成全局共享的了.有其他现成正在同一个回话里执行SQL

收获园豆:5
吴瑞祥 | 高人七级 |园豆:28891 | 2014-02-14 14:44

DbContext是封装好的,我不知道怎么去设置

魔女小溪 | 园豆:38 (初学一级) | 2014-02-14 14:46

问题中,我补充了东西,你可以看下

魔女小溪 | 园豆:38 (初学一级) | 2014-02-14 14:49

@魔女小溪: 你 EfRepository(UnitOfWorkIQueryable unitOfWork) 构造函数传入的对象至少得是线程单例的.

不能是全局的

吴瑞祥 | 园豆:28891 (高人七级) | 2014-02-14 15:04

@吴瑞祥: 我能说句欠揍的话吗?这个我还真是不懂,请问一下怎么修改?

魔女小溪 | 园豆:38 (初学一级) | 2014-02-14 15:07

@魔女小溪: 你把实例化EfRepository对象的代码发上来看看

吴瑞祥 | 园豆:28891 (高人七级) | 2014-02-14 15:11

@吴瑞祥: 

private static void Repository(Autofac.ContainerBuilder builder)
{
#region repository

builder.RegisterGeneric(typeof(EfRepository<>)).As(typeof(IRepository<>)).InstancePerHttpRequest();

#endregion
}

 

用的是ioc依赖注入模式

魔女小溪 | 园豆:38 (初学一级) | 2014-02-14 15:15

@魔女小溪: 都没看见他构造函数是怎么传参的,Autofac我也没用过,不太知道.

不是自己做的话就去问下做的人,问他这个项目里EF上下文是怎么管理的.

吴瑞祥 | 园豆:28891 (高人七级) | 2014-02-14 15:27

@吴瑞祥: 可悲的是,做这个项目的人,早就走了,而且我都没见过这个人,之前接手这个项目的人,也不是开发这个项目的人,而且他也走的快,所以,我还没来得急问呢!哎,我一个人负责3个项目,真是有够晕的。。。

魔女小溪 | 园豆:38 (初学一级) | 2014-02-14 15:30

@魔女小溪: 你看下项目配置文件里Autofac的配置吧,

吴瑞祥 | 园豆:28891 (高人七级) | 2014-02-14 15:36
其他回答(2)
0

报错的堆栈信息发粗来

火车叨位去丶 | 园豆:2 (初学一级) | 2014-02-14 14:04

不发那我走了

支持(0) 反对(0) 火车叨位去丶 | 园豆:2 (初学一级) | 2014-02-14 14:11

@刘小猪: 晕啊 你的两次回复相差7秒 谁能反应这么快

支持(0) 反对(0) 许你一世幸福 | 园豆:82 (初学一级) | 2014-02-14 14:13

等下呀,我刚刚吃汤圆去了,等等。。。拜托了啦

支持(0) 反对(0) 魔女小溪 | 园豆:38 (初学一级) | 2014-02-14 14:15

@组织万岁: 7分钟啊。。。

支持(0) 反对(0) 鳳梨酥 | 园豆:287 (菜鸟二级) | 2014-02-14 14:19

@魔女小溪: 这个不是ef报问题 你是代码里面事务用多了的问题  提示已经说了 

支持(0) 反对(0) 火车叨位去丶 | 园豆:2 (初学一级) | 2014-02-14 14:35

@刘小猪: 我给你看下代码

支持(0) 反对(0) 魔女小溪 | 园豆:38 (初学一级) | 2014-02-14 14:37

@刘小猪: 

//更新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;
}

支持(0) 反对(0) 魔女小溪 | 园豆:38 (初学一级) | 2014-02-14 14:38

@魔女小溪: 有意思 领域驱动?  你这项目有多大 这里面看不到那写了事务

支持(0) 反对(0) 火车叨位去丶 | 园豆:2 (初学一级) | 2014-02-14 14:50

@刘小猪: 本来就已经封装好了,我也是刚刚接手这个项目,对于EF还不懂,我问题里面有补充的

支持(0) 反对(0) 魔女小溪 | 园豆:38 (初学一级) | 2014-02-14 14:55

@魔女小溪: 你找找在哪用了事务就行了

支持(0) 反对(0) 火车叨位去丶 | 园豆:2 (初学一级) | 2014-02-14 15:31

@刘小猪:没看到呀。。呜呜呜

支持(0) 反对(0) 魔女小溪 | 园豆:38 (初学一级) | 2014-02-14 15:35
0

不懂。 帮顶

 

不过, 重启sql试试。 

undefined | 园豆:698 (小虾三级) | 2014-02-14 15:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册