Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 相对于我的模型,我应该有多少DbContext子类?_Asp.net Mvc_Entity Framework - Fatal编程技术网

Asp.net mvc 相对于我的模型,我应该有多少DbContext子类?

Asp.net mvc 相对于我的模型,我应该有多少DbContext子类?,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我正在学习ASP.NETMVC,我有一些问题,我读过的教程到目前为止还没有以涵盖我的方式探讨过。我尝试过搜索,但没有发现任何问题。尽管如此,如果我错过了一个现有的,请原谅我 如果我有一个ASP.NET MVC应用程序,它有许多模型(其中一些相互关联,一些互不关联),如果我想为我的应用程序全局使用一个连接字符串和一个数据库,我应该创建多少DbContext子类 每个模型都有一个上下文 每组相关模型的一个上下文 所有模型都有一个上下文 如果答案是前两个中的一个,那么我是否应该考虑确保只为整个应用

我正在学习ASP.NETMVC,我有一些问题,我读过的教程到目前为止还没有以涵盖我的方式探讨过。我尝试过搜索,但没有发现任何问题。尽管如此,如果我错过了一个现有的,请原谅我

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

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

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

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

在我看来,它正在创建尽可能多的数据库 上下文


没错,实体框架将为每个
DbContext
类型创建一个数据库

SystemUsers
代码可能与
产品无关
——因此我可能有一个System-DbContext和一个Shop-DbContext(例如)


在一个小应用程序中使用一个上下文更容易,但对于更大的应用程序,它有助于分解上下文。

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

public class MyContext : DbContext
{
    public MyContext()
        : base("name=DatabaseConnectionStringNameHere")
    {
        Database.SetInitializer(null);
    }
}
换句话说,Julie的方法只是建立了一个基类,您的每个上下文都可以从该基类继承该基类,该基类自动处理该片段

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


使用专门化上下文时要记住的另一件事是,每个上下文的每个实例化表示一个唯一的状态,即使它们共享实体。例如,来自一个上下文的
Cat
实体与来自第二个上下文的
Cat
实体并不相同,即使它们共享相同的主键。如果从第一个上下文中检索到
Cat
,对其进行更新,然后尝试通过第二个上下文保存,则会出现错误。这个例子有点做作,因为你不可能在两个不同的上下文中显式地拥有相同的实体,但是当你进入外键关系时,遇到这个问题要常见得多。即使您没有为相关实体显式声明
DbSet
,但上下文中的实体依赖于它,EF也会隐式为它创建
DbSet
。所有这一切都意味着,如果您使用专门化的上下文,您需要确保它们是真正专门化的,并且在任何级别的相关项上都没有交叉。

谢谢,您的答案是中肯的。不幸的是,我的应用程序只能使用一个数据库。从您的回答中我了解到,这意味着无论发生什么情况,我都必须使用一个
DbContext
类型,对吗?不,这只是默认约定。如果每个上下文都有相同的连接字符串,那么它应该可以工作。但是,如果您想使用迁移,则需要为每个上下文提供一个单独的数据库。谢谢。我在寻找这样的概念。