我正在学习 ASP.NET MVC,但我遇到了一些问题,到目前为止我读过的教程还没有以涵盖我的方式进行探讨。我尝试过搜索,但没有看到任何询问此问题的问题。不过,如果我错过了现有的,请原谅我。
如果我有一个 ASP.NET MVC 应用程序,它有多个模型(其中一些模型相关,一些模型彼此不相关),那么有多少个模型?DbContext
如果我想使用,我应该创建子类一个连接字符串 and 一个数据库我的应用程序在全球范围内?
- 每个模型都有一个上下文?
- 每组相关模型都有一个上下文?
- 所有模型的一个上下文?
如果答案是前两个之一,那么我应该记住什么来确保只有one数据库是为整个应用程序创建的吗?我问这个问题是因为,在 Visual Studio 中进行本地调试时,在我看来,它会创建与上下文一样多的数据库。这就是为什么我发现自己使用第三个选项,但我想知道这是否是正确的做法,或者我是否犯了某种错误,以后会回来咬我。
@jrummell 仅部分正确。实体框架将为每个 DbContext 类型创建一个数据库,if你把它留给它自己的设备。使用 @NeilThompson 从 Julie Lerhman 提到的“有界上下文”的概念,您所做的实际上就是告诉每个上下文实际使用相同的数据库。 Julie 的方法使用一种通用模式,以便实现它的每个 DbContext 最终都位于同一个数据库上,但您可以为每个 DbContext 手动执行此操作,如下所示:
public class MyContext : DbContext
{
public MyContext()
: base("name=DatabaseConnectionStringNameHere")
{
Database.SetInitializer(null);
}
}
换句话说,朱莉的方法只是设置一个基类,每个上下文都可以继承该基类,自动处理这一部分。
这会做两件事:1)它告诉您的上下文使用特定的数据库(即与其他所有上下文相同),2)它告诉您的上下文禁用数据库初始化。最后一部分很重要,因为这些上下文现在基本上被视为数据库优先。换句话说,您现在没有上下文可以真正导致创建数据库,或者发出需要发生迁移的信号。结果,你实际上需要another“主”上下文将包含应用程序中的每个实体。不过,除了创建迁移和更新数据库之外,您不必使用此上下文进行任何其他操作。对于您的代码,您可以使用更专业的上下文。
关于专用上下文要记住的另一件事是,每个上下文的每个实例都代表一个unique即使他们共享实体。例如,一个Cat
来自一个上下文的实体是not与a相同的事情Cat
来自第二个上下文的实体,即使它们共享相同的主键。如果您检索到,您将收到错误Cat
从第一个上下文中更新它,然后尝试通过第二个上下文保存它。该示例有点人为,因为您不太可能在两个不同的上下文中显式地拥有相同的实体,但是当您进入外键关系等时,遇到此问题的情况要普遍得多。即使您没有明确声明DbSet
对于相关实体,如果上下文中的实体依赖于它,EF 将隐式创建一个DbSet
为了它。所有这一切都是说,如果您使用专门的上下文,您需要确保它们真正专门化并且存在zero任何级别的相关项目的交叉。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)