我使用一个基本控制器,它公开了DataBase
派生控制器可以访问的属性。
public abstract class BaseController : Controller
{
public BaseController()
{
Database = new DatabaseContext();
}
protected DatabaseContext Database { get; set; }
protected override void Dispose(bool disposing)
{
Database.Dispose();
base.Dispose(disposing);
}
}
我的应用程序中的所有控制器BaseController
均源自并按如下方式使用:
public class UserController : BaseController
{
[HttpGet]
public ActionResult Index()
{
return View(Database.Users.OrderBy(p => p.Name).ToList());
}
}
现在回答您的问题:
什么时候应该创建一个新的DbContext /应该传递一个全局上下文?
应该根据请求创建上下文。创建上下文,执行所需的操作,然后删除它。使用基类解决方案,我只需要担心使用上下文。
不要尝试具有全局上下文(这不是Web应用程序的工作方式)。
我可以在所有地方重复使用一个全局上下文吗?
不,如果您保持上下文相关,它将跟踪所有更新,添加,删除等操作,这会使您的应用程序变慢,甚至可能导致一些非常细小的错误出现在您的应用程序中。
您可能应该选择将存储库或上下文公开给控制器,但不要两者都公开。如果使用相同的方法访问两个上下文,则如果它们对应用程序的当前状态有不同的想法,则会导致错误。
就我个人而言,我更喜欢DbContext
直接公开,因为我看到的大多数存储库示例DbContext
无论如何最终都只是薄薄的包装。
这会导致性能下降吗?
第一次DbContext
创建a的代价是非常昂贵的,但是一旦完成,就会缓存很多信息,因此后续实例化会更快。与在每次需要访问数据库时实例化一个上下文相比,保留一个上下文更可能导致性能问题。
其他人怎么做?
这取决于。
有些人喜欢使用依赖项注入框架在创建控制器时将其上下文的具体实例传递给其控制器。两种选择都很好。Mine更适合小型应用程序,在这种应用程序中您知道所使用的特定数据库不会改变。
有些人可能会争辩说您不知道这一点,这就是为什么依赖项注入方法更好,因为它使您的应用程序更能适应更改。我对此的看法是,它可能不会改变(几乎不会模糊SQL Server和Entity Framework),并且我的时间最好花在编写针对我的应用程序的代码上。