为啥有多个 DbContext 类?

Posted

技术标签:

【中文标题】为啥有多个 DbContext 类?【英文标题】:Why multiple DbContext classes?为什么有多个 DbContext 类? 【发布时间】:2013-04-20 00:47:24 【问题描述】:

当我使用带有 .dbml 文件的 LINQ 进行编程时,只有一个上下文。但是,当我创建一个 MVC 站点时,似乎每个实体都有单独的上下文(这是 MVC 教程向我展示的方式;使用“电影”上下文)。

我有:

public class AccountsContext : DbContext

    public AccountsContext()
        : base("DefaultConnection")
    
    

    public DbSet<Account> Accounts  get; set; 

而且,我有:

public class ClientsContext : DbContext

    public ClientsContext()
        : base("DefaultConnection")
    
    

    public DbSet<Client> Clients  get; set; 

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

private AccountsContext db = new AccountsContext();
private ClientsContext clientsContext = new ClientsContext();

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

有没有办法只使用一个上下文б,是否推荐?

【问题讨论】:

【参考方案1】:

不应该有任何东西阻止您使用一种上下文。数据库以及用于访问它的工具应该完全独立于它之外的任何东西(业务逻辑、服务层、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; 

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

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

您的数据上下文将进入您的数据层。您的逻辑将进入您的业务逻辑层。

【讨论】:

Movies MVC 示例专门且有意地使用了多个上下文。 asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/cs/…。为什么,我不知道。也许只是为了说明这样做是可能的。对于非常大的应用程序来说,这可能是一件可取的事情;您可以为公司的每个部门或每个物理数据库创建一个上下文。 您知道这样做是否有充分的理由吗?所以也许 OP 认为它必须这样做,因为那个例子? @BobHorn 有没有办法在单独的文件中执行您所做的操作?例如,我希望在 accounts.cs 文件中与“帐户”相关的所有逻辑以及在 clients.cs 文件中与“客户”相关的所有逻辑 - 而不是在同一个文件中声明帐户和客户(这可能会造成混淆在路上)。 @user1477388 上下文类是一个分部类,因此您可以创建多个分部类。但是,逻辑不应该放在这些文件中,它们应该放在您的业务逻辑类中。 @user1477388 通常,BLL 是存储业务逻辑的一个地方。这样它就不会散布在您的整个系统中,因此可以围绕它画一条信任线(围绕它的安全性)。如果您有一个简单的应用程序,并且只有模型、视图和控制器,那么将您的逻辑放入模型中。它绝对不属于您的数据类。

以上是关于为啥有多个 DbContext 类?的主要内容,如果未能解决你的问题,请参考以下文章

EntityFramework中多个dbcontext中的每个请求的事务

3.Context

如何将多个模型保存到 Db Context (EF)

dbContext 不会更新

在WEB.XML中可以配置多对<context-param>吗?为啥我配置的多个只有第一个读入了程序?

从迁移中排除 DbContext 以避免 Context-Parameter