首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管理DbContext EF6

管理DbContext EF6
EN

Stack Overflow用户
提问于 2014-08-07 00:53:50
回答 3查看 685关注 0票数 0

我正在建立一个Webforms EF6数据库的第一个应用程序,不确定如何最好地管理DbContext。我看了很多教程和论坛帖子,但我仍然很确定。关于非常受欢迎的“按请求使用”,我还没有找到一种一次性保存父母和孩子的方法。我让它与下面的代码一起工作,但是我应该在哪里以及什么时候处理上下文呢?我可以使用这种方法吗?Kamyar shown here的per request方法会更好吗?

这是我现在得到的:

代码语言:javascript
复制
public static class ContextManager
{
    [ThreadStatic]
    private static MyContext current;

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

        return current;
    }}
}

再加上

代码语言:javascript
复制
var context = ContextManager.MyCurrentContext;
.....
context.SaveChanges();

提前感谢您的帮助!

一个具体的例子是'UserProfile‘,它包含子对象作为属性,比如'DefaultInvoiceAddress’,它返回表中用户的默认发票地址和所有用户的地址。在我工作的上一个web应用程序中,当用户在配置文件中编辑此地址(例如街道变化)以及其他表中的其他配置文件信息时,EF会在一个请求中保存来自不同表的所有编辑信息(确保它们是附加的)。由于我不了解上下文管理,我不知道它是如何完成的,但我们总是为请求分配一个通用的当前上下文。

我遇到了this post by Rick Strahlthis one by Jordan van Gogh -业务对象/事务似乎是一个答案,但我不太理解如何实现它,也找不到一个示例。“每个HTTP请求的共享ObjectContext实例”与上面提到的Kamyar的答案相对应,综合考虑,它听起来是个不错的选择。我是否必须显式地处理上下文,如果是这样,何时/何地?有什么缺点吗?

EN

回答 3

Stack Overflow用户

发布于 2014-08-07 00:57:42

馊主意。静态完全违背了最佳实践。没有两个用户会同时使用这个应用吗?唉哟。为了WebForms。

Per request是最佳选择。

票数 0
EN

Stack Overflow用户

发布于 2014-08-07 01:12:48

EF数据库上下文对象是而不是,我重复一遍,不管你怎么管理它,都不是线程安全。跨线程共享数据库上下文可能会出现许多问题,因此,如上所述,最好的方法是在每个请求中使用它。

如果你不想跳到IoC/DI这一方面,一种非常简单的方法是,每当你需要数据库时,你只需在using块中实例化你的上下文,如下所示:

代码语言:javascript
复制
using(var db = new MyContext())
{
    // code reading from/writing to database
    ...
    ...
}
票数 0
EN

Stack Overflow用户

发布于 2015-04-22 16:39:37

将单例模式与实体框架数据库上下文一起使用是一个设计缺陷,特别是当您使用并发环境时,因为您必须考虑到DbContext不是线程安全对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25165921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档