C# 如何解决;已存在与此连接关联的打开的datareader“;
主要问题是,当web应用程序启动到internet时,当负载较高时,会引发异常,告知已经有一个打开的数据读取器 以下是我们使用的规格: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
- 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;
}
}