6

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

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

  • 每个模型都有一个上下文?
  • 每组相关模型都有一个上下文?
  • 所有模型的一个上下文?

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

4

3 回答 3

5

我使用 Julie Lerman 所说的限界上下文

代码可能与此SystemUsers无关Products- 所以我可能有一个 System DbContext 和一个 Shop DbContext(例如)。

在小型应用程序中使用单个上下文会更轻松,但对于较大的应用程序,它有助于分解上下文。

于 2013-04-12T19:29:23.653 回答
5

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

public class MyContext : DbContext
{
    public MyContext()
        : base("name=DatabaseConnectionStringNameHere")
    {
        Database.SetInitializer(null);
    }
}

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

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

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

于 2013-04-12T21:31:12.127 回答
0

DbContext通常,每个数据库都应该有一个。但是,如果您有单独的、不相关的模型组,那么拥有单独的实现是有意义的DbContext

在我看来,它创建的数据库与上下文一样多。

没错,Entity Framework 将为每种DbContext类型创建一个数据库。

于 2013-04-12T19:17:47.297 回答