Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何解决;已存在与此连接关联的打开的datareader“;_C#_Mysql_Asp.net_Entity Framework - Fatal编程技术网

C# 如何解决;已存在与此连接关联的打开的datareader“;

C# 如何解决;已存在与此连接关联的打开的datareader“;,c#,mysql,asp.net,entity-framework,C#,Mysql,Asp.net,Entity Framework,主要问题是,当web应用程序启动到internet时,当负载较高时,会引发异常,告知已经有一个打开的数据读取器 以下是我们使用的规格: Entityframework 5.0.0 MySQL数据库 有没有办法不用using(){}块来解决这个问题?这种方法的主要问题是,当关闭using块时,我无法在html视图中扩展entityframework对象的外键关系 我还附上了一些源代码,展示了如何在整个应用程序中保持单个数据库上下文 public abstract class AbstractS

主要问题是,当web应用程序启动到internet时,当负载较高时,会引发异常,告知已经有一个打开的数据读取器

以下是我们使用的规格:

  • Entityframework 5.0.0
  • MySQL数据库
有没有办法不用
using(){}
块来解决这个问题?这种方法的主要问题是,当关闭using块时,我无法在html视图中扩展entityframework对象的外键关系

我还附上了一些源代码,展示了如何在整个应用程序中保持单个数据库上下文

public abstract class AbstractService
{
    public Entities db_model
    {
        get
        {
            return DbContext.Instance.db_model;
        }
    }
}

public class DbContext
{
    public Entities db_model = new Entities();
    private static DbContext _dbContext;

    public static DbContext Instance
    {
        get
        {
            if(_dbContext == null)
            {
                _dbContext = new DbContext();
            }
            return _dbContext;
        }
    }
}

这个答案与问题中提到的关于在ASP.NET视图中使用加载的实体的问题特别相关。该问题询问了一种解决此问题的方法,而无需使用块或处理DbContext,但是我建议这样做

原因是通常不希望在ASP.NET视图中使用实体框架对象,因为这些对象不仅仅是普通的POCO对象;它们隐藏了允许它们充当底层数据库代理的逻辑,因此它们对创建它们的
DbContext
的状态具有隐藏的依赖关系

下面是一个人为的示例,使用EF模型为
员工
部门
创建
DbContext

public class CompanyDbContext : DbContext
{
    public DbSet<Department> Departments { get; set; }
    public DbSet<Employee> Employees { get; set; }
}

public class Department
{
    public long Id { get; set; }
    public virtual ICollection<Employee> Employees { get; set; }
}

public class Employee
{
    public long Id { get; set; }
    public long DepartmentId { get; set; }
    public virtual Department Department { get; set; }
}
能够使用这些POCO模型,同时需要一些额外的样板代码,在
DbContext
和ASP.NET之间提供了完全的分离,允许在ASP.NET视图/控制器不关心
DbContext
的生存期或状态的情况下使用数据

有时,这种方法看起来似乎违反了“干燥”原则,但我要指出,EF对象和ViewModel对象的存在是为了解决不同的问题,ViewModel对象采用不同的形状并不罕见,甚至需要不适合添加到EF类的其他字段/属性


最后,上面使用的是“手动”映射,但是如果映射非常简单和直接,那么使用AutoMapper就更有意义了:

不要使用静态上下文@GertArnold Okey那么我如何从应用程序的不同部分获得相同的上下文呢?只是不需要。每个请求的上下文是web应用程序的推荐模式。无法在html视图中展开entityframework对象的外键关系--我强烈建议您不要在ASP.NET视图中使用Entity Framework对象。相反,请尝试将所有单个字段数据复制到新对象(视图模型)中。这将通过使用单独的模型在“数据”层和“视图”层之间保持干净的分离。这样,您就可以使用块在
中正确地使用DbContext。将所有视图数据复制到完全独立的类中是很常见的。
public class DepartmentModel
{
    public long Id { get; set; }
    public List<EmployeeModel> Employees { get; set; }
}

public class EmployeeModel
{
    public long Id { get; set; }
    public long DepartmentId { get; set; }
}
    public List<DepartmentModel> GetAllDepartments()
    {
        using (var ctx = new CompanyDbContext())
        {
            // Ensure that related data is loaded
            var departments = ctx.Departments
                .Include(d => d.Employees);

            // Manual mapping by converting into a new set of models to be used by the Views
            var models = departments
                .Select(d => new DepartmentModel
                {
                    Id = d.Id,
                    Employees = d.Employees
                             .Select(e => new EmployeeModel
                             {
                                 Id = e.Id,
                                 DepartmentId = e.DepartmentId
                             })
                             .ToList(),
                })
                .ToList();

            return models;
        }
    }