繁体   English   中英

管理DbContext EF6

[英]Managing DbContext EF6

我正在构建Webforms EF6数据库第一个应用程序,并且不确定如何最好地管理DbContext。 我看了很多教程和论坛帖子,但我仍然确定。 关于备受青睐的“按请求使用”,我还没有找到一种一次性拯救父母和子女的方法。 我可以将其与下面的代码一起使用,但是我应该在何时何地处理上下文? 我可以使用这种方法吗? 此处显示的Kamyar的按请求方式会更好吗?

这是我现在得到的:

public static class ContextManager
{
    [ThreadStatic]
    private static MyContext current;

    public static MyContext MyCurrentContext
    {
        get{
        if (current == null)
            current = new MyContext();

        return current;
    }}
}

加上

var context = ContextManager.MyCurrentContext;
.....
context.SaveChanges();

在此先感谢您的帮助!

一个特定的示例是“ UserProfile”,其中包含子对象作为属性,例如“ DefaultInvoiceAddress”,该属性从具有所有用户地址的表中返回用户的默认发票地址。 在我工作的上一个Web应用程序中,当用户从配置文件中编辑此地址(例如,街道变更)以及其他表中的其他配置文件信息时,EF会在一个请求中保存来自不同表的所有编辑信息(确保他们重新连接)。 由于我对上下文管理不了解,所以我不知道它是如何完成的,但是我们总是会为请求分配一个通用的当前上下文。

我遇到了Rick Strahl撰写的这篇文章 ,以及Jordan Jordan Go Gogh 撰写的这篇文章 -业务对象/事务似乎是一个答案,但是我不太了解如何实现它,也找不到示例。 “每个HTTP请求的共享ObjectContext实例”对应于上面提到的Kamyar的回答,并且考虑到所有因素,这听起来是一个不错的选择。 如果需要,我是否必须明确处置上下文? 有什么缺点吗?

馊主意。 静态完全违反最佳实践。 没有2个用户会同时使用该应用程序吗? 哎哟。 对于WebForms。

每个请求是最佳选择。

EF db上下文对象不是 ,无论您如何管理,我都重复执行NOT线程安全。 跨线程共享db上下文会引起很多问题,因此最好的方法是如上所述,根据请求使用它。

如果您不想跳到IoC / DI方面,那么一种非常简单的方法就是只要需要数据库,就可以在using块中实例化上下文,如下所示:

using(var db = new MyContext())
{
    // code reading from/writing to database
    ...
    ...
}

在实体框架数据库上下文中使用单例模式是一个设计缺陷,特别是在处理诸如Web表单之类的并发环境时,因为必须考虑DbContext不是线程安全的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM