【问题标题】:MySql.Data.MySqlClient.MySqlException: There is already an open DataReader associated with this Connection which must be closed firstMySql.Data.MySqlClient.MySqlException:已经有一个打开的 DataReader 与此 Connection 关联,必须先关闭
【发布时间】:2018-04-04 13:23:32
【问题描述】:

我们遇到了 mysql、实体框架 6.0 和存储库模式的问题。 这是当我们尝试与多个用户同时添加实体时发生的错误。 我们不使用 IQueryable 返回类型(如其他主题中建议的那样)。 这是返回错误的代码:

using (var dbContextTransaction = rep.Context.Database.BeginTransaction())
{
try
{
    rep.Add(newSchedule);
    rep.Save();

    dbContextTransaction.Commit();
}
catch (Exception ex)
{

    dbContextTransaction.Rollback();
    Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
}

}

使用和不使用数据库事务触发的错误。 堆栈跟踪指向调用这部分代码的函数。 有解决这个问题的想法吗?提前致谢。

【问题讨论】:

  • 有什么异常?
  • 这是一个 MVC 应用程序吗? rep 是静态的吗?
  • 意外异常 - MySql.Data.MySqlClient.MySqlException:已经有一个打开的 DataReader 与此 Connection 关联,必须先关闭。是的,MVC 应用和代表是静态的
  • 由于它是静态的,所有请求都将使用相同的实例。确保为每个请求实例化一个新实例。
  • 谢谢,我们试试,让你知道

标签: c# mysql entity-framework linq


【解决方案1】:

EF 上下文不是线程安全的,您需要为每个请求创建一个上下文。也许你可以注入一个工厂并询问上下文。 或者在你的 DI 容器中将上下文设置为 Transient。

希望这会有所帮助。

【讨论】:

  • 谢谢,现在我在帮助类中为每个请求创建一个上下文,它可以工作了。
猜你喜欢
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 2013-07-18
相关资源
最近更新 更多