与模型相比,我应该拥有多少个DbContext子类?

The*_*kis 5 asp.net-mvc entity-framework

我正在学习ASP.NET MVC,而且我有一些问题,我到目前为止所阅读的教程并没有以涵盖我的方式进行探索.我试过搜索,但我没有看到任何问题.如果我错过了现有的,请原谅我.

如果我有一个ASP.NET MVC应用程序,它有许多模型(其中一些是相关的,一些是相互关联的),DbContext我应该创建多少个子类,如果我想为我的全局使用一个连接字符串一个数据库应用?

  • 每种型号都有一个背景?
  • 每组相关模型的一个背景?
  • 所有型号的一个背景?

如果答案是前两个中的一个,那么我是否应该考虑确保只为整个应用程序创建一个数据库?我问,因为在Visual Studio中进行本地调试时,我认为它创建了与上下文一样多的数据库.这就是为什么我发现自己使用第三种选择,但我想知道这是不正确的做法,还是我犯了某种错误,这种错误会在以后再次出现.

Nei*_*son 5

我使用Julie Lerman所谓的有界上下文

SystemUsers代码可能无关Products-所以我可能有一个系统的DbContext和一个店铺的DbContext(例如).

在小应用程序中使用单个上下文可以更轻松地生活,但对于更大的应用程序,它有助于打破上下文.


Chr*_*att 5

@jrummell 只是部分正确。Entity Framework 将为每个 DbContext 类型创建一个数据库,如果您将其留给自己的设备。使用@NeilThompson 从Julie Lerhman 提到的“有界上下文”的概念,您所做的基本上就是告诉每个上下文实际使用相同的数据库。Julie 的方法使用通用模式,因此实现它的每个 DbContext 最终都位于同一个数据库上,但您可以为每个数据库手动执行此操作,如下所示:

public class MyContext : DbContext
{
    public MyContext()
        : base("name=DatabaseConnectionStringNameHere")
    {
        Database.SetInitializer(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

换句话说,Julie 的方法只是设置了一个基类,您的每个上下文都可以从它继承来自动处理这部分。

这有两件事:1) 它告诉您的上下文使用特定的数据库(即,与所有其他上下文相同)和 2) 它告诉您的上下文禁用数据库初始化。最后一部分很重要,因为这些上下文现在基本上被视为数据库优先。换句话说,您现在没有可以实际导致创建数据库或发出需要进行迁移的信号的上下文。因此,您实际上需要另一个“主”上下文,它将包含应用程序中的每个实体。但是,除了创建迁移和更新数据库之外,您不必将此上下文用于任何其他事情。对于您的代码,您可以使用更专业的上下文。

对于专用上下文要记住的另一件事是,每个上下文的每个实例化都代表一个独特的状态,即使它们共享实体。例如,Cat从一个上下文实体是一样的东西作为Cat从第二上下文的实体,即使它们共享相同的主键。如果您Cat从第一个上下文中检索、更新它,然后尝试通过第二个上下文保存它,您将收到错误消息。这个例子有点人为,因为你不太可能在两个不同的上下文中明确地拥有相同的实体,但是当你进入外键关系时,遇到这个问题的情况要常见得多。即使您没有明确声明DbSet对于相关实体,上下文中的实体依赖于它,EF 将为它隐式创建一个DbSet。这就是说,如果您使用专门的上下文,您需要确保它们是真正专门的,并且在任何级别的相关项上都存在交叉。