管理DbContext EF6

时间:2014-08-06 16:53:50

标签: c# entity-framework dbcontext

我正在构建一个Webforms EF6数据库第一个应用程序,并且不确定如何最好地管理DbContext。我查看了很多教程和论坛帖子,但我仍然确定。关于备受青睐的“按要求使用”,我还没有找到一种方法来保存父母和母亲。孩子们一气呵成。我让它使用下面的代码,但我会在何时何地处理上下文?我可以使用这种方法吗? Kamyar shown here的每个请求方法会更好吗?

这就是我现在所拥有的:

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将在一个请求中保存来自不同表的所有编辑信息(确保它们'重新附加)。由于我不了解上下文管理,我不知道它是如何完成的,但我们总是为请求分配一个共同的当前上下文。

我遇到了this post by Rick Strahlthis one by Jordan van Gogh - 业务对象/事务似乎是一个答案,但我不太明白如何实现它并且找不到示例。每个HTTP请求的“共享ObjectContext实例”对应于上面提到的Kamyar的答案,考虑到所有事情,这听起来不错。我是否必须明确处理上下文,如果是/ where?有什么缺点吗?

2 个答案:

答案 0 :(得分:0)

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

根据要求是最佳选择。

答案 1 :(得分:0)

EF db上下文对象,无论你如何管理它,我都会重复 NOT threadsafe。跨线程共享数据库上下文可能会产生很多问题,因此最好的方法是,如上所述,每个请求都使用它。

如果您不想进入IoC / DI方面,那么一个非常简单的方法就是在您需要数据库时,只需在using块中实例化您的上下文,就像这样:

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