为什么有多个DbContext类?

use*_*388 9 c# asp.net-mvc entity-framework

当我使用带有.dbml文件的LINQ进行编程时,只有一个上下文.但是,当我做一个MVC网站时,似乎我为每个实体都有单独的上下文(这就是MVC教程向我展示如何做到这一点的方式;以及"电影"上下文).

我有:

public class AccountsContext : DbContext
{
    public AccountsContext()
        : base("DefaultConnection")
    {
    }

    public DbSet<Account> Accounts { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有:

public class ClientsContext : DbContext
{
    public ClientsContext()
        : base("DefaultConnection")
    {
    }

    public DbSet<Client> Clients { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我调用它们时,我必须创建单独的上下文,例如:

private AccountsContext db = new AccountsContext();
private ClientsContext clientsContext = new ClientsContext();
Run Code Online (Sandbox Code Playgroud)

...这两者都很烦人,而且它似乎是多余的,因为我知道当我使用LINQ时,我只需要实例化一个数据库对象.

有没有办法只使用一个上下文?这是推荐的吗?

Bob*_*orn 13

不应该阻止您使用一个上下文.数据库和用于访问它的工具应该完全独立于它之外的任何东西(业务逻辑,服务层,UI等......).

上下文的数量或您如何使用它们不应该根据您的客户端技术进行更改.

那么MVC会让你相信你需要不止一个上下文?是什么阻止你这样做?

如果您认为需要为每个实体使用上下文,因为样本是这样的,您不需要.只需使用一个上下文.

如果它有帮助,这就是多个实体的简单上下文:

public partial class abook_dbEntities : DbContext
{
    public abook_dbEntities()
        : base("name=abook_dbEntities")
    {
    }

    public DbSet<Entity> Entities { get; set; }
    public DbSet<Contact> Contacts { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如果有帮助,典型的业务流程如下所示:

UI - >控制器 - >业务逻辑 - >数据访问 - >数据库

您的数据上下文将包含在您的数据层中.您的逻辑将进入您的业务逻辑层.

  • 电影MVC示例专门和故意使用多个上下文.http://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/cs/adding-a-model.为什么,我不知道.也许只是为了说明有可能这样做.对于非常大的应用程序来说,它可能是理想的事情; 您可以为公司的每个部门或每个物理数据库创建一个上下文. (5认同)