为啥有多个 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中的每个请求的事务