Asp.net mvc 控制和管理DbContext

Asp.net mvc 控制和管理DbContext,asp.net-mvc,entity-framework,dbcontext,Asp.net Mvc,Entity Framework,Dbcontext,现在我有了这个背景 namespace Dafoor_MVC.Models { public class DafoorDBContext : DbContext { public DbSet<Department> departments { get; set; } public DbSet<Course> courses { get; set; } public DbSet<Reply> replies { get; set;

现在我有了这个背景

namespace Dafoor_MVC.Models
{
  public class DafoorDBContext : DbContext
  {
    public DbSet<Department> departments { get; set; }
    public DbSet<Course> courses { get; set; }
    public DbSet<Reply> replies { get; set; }
  }
}
namespace Dafoor\u MVC.Models
{
公共类DafoorDBContext:DbContext
{
公共数据库集部门{get;set;}
公共数据库集课程{get;set;}
公共数据库集回复{get;set;}
}
}
这个背景会越来越大,因为我想添加大约40个模型

1-将40个模型放在一个上下文中是一个好主意吗

2-我希望在所有用户之间共享此上下文,因为如果记录已经在上下文中,我不希望每次都用查询命中数据库,但这会影响服务器内存,因此如何实现类似的功能“上一个对象曾经被释放,或者没有被调用的对象需要一段时间才能从上下文中释放”?我不想处理整个上下文

3-如果第2点不起作用,我可以在用户会话中放置一个上下文实例,这样上下文将是用户特定的,而不是应用程序特定的吗

将40个模型放在一个上下文中是一个好主意吗

如果它们在逻辑上都属于同一类,那就没有什么错

我希望在所有用户之间共享此上下文

不,您不需要。您希望为每个单独的HTTP请求实例化一个上下文,并在处理HTTP请求之前处理它。不要缓存DbContext

我是否可以在用户会话中放置上下文实例,以便上下文是特定于用户的,而不是特定于应用程序的

您不应缓存上下文。但是,您可以在会话中存储使用上下文检索的对象。如果不先将对象重新附加到新上下文,您将无法更新对象/对象图

更新

以下是DbContext存储在当前HTTP请求之外的原因:

1)没有理由担心在一个上下文类中有40多个数据库集。它们只是集合,只填充了您当前使用的对象

2) DbContext和DbSet的实例成员不能保证线程安全。我不推荐使用单例方法


3) 可以,但请确保正确处理数据库并发异常

问题是我希望利用服务器内存,而不是每次都访问数据库。我希望第二次调用find方法的优势。例如:context.departments.find(someID)第一次它将使用select查询,但第二次它将从上下文返回对象。然后,您需要将物化对象存储在会话中(或缓存中,如果对象在所有用户之间共享)。如果尝试缓存DbContext,尤其是尝试在用户之间共享它,则会发生非常糟糕的情况。不,不要在用户会话中存储DbContext(第3点)。请参阅