是否可以为整个项目使用一个DbContext对象?

时间:2015-08-13 17:18:05

标签: c# entity-framework dbcontext

我正在开发一个使用Entity Framework 6 for MySql的c#项目。将对象添加到dbContext我使用以下方法:

    public void Add(User item)
    {
        using (var ctx = new DbContext())
        {
            ctx.Users.Add(item);
            ctx.SaveChanges();
        }
    }

现在我需要知道是否可以使用一个DbContext对象:

private DbContext _ctx = new DbContext();

并将Add方法更改为

    public void Add(User item)
    {
        _ctx.Users.Add(item);
        _ctx.SaveChanges();
    }

然后使用另一种方法来处理DbContext对象并在应用程序退出时调用它。

这是一个好方法吗?这种方法的缺点和优点是什么?

先谢谢。

2 个答案:

答案 0 :(得分:2)

考虑将DbContext作为班级成员的利弊:

优点:

  • 您保存一行代码和两个大括号

缺点:

  • 这不是线程安全的。一个线程可能尝试读取或写入可能未处于正确状态的另一个线程生成的数据。
  • 随着对象的添加,上下文的大小会增加,从而增加内存使用量。
  • 有人必须处理包含类。
  • 对于网络应用,由于每个请求都会创建自己的对象(除非您将其缓存在ApplicationSession中)
  • ,因此无关紧要

DbContext旨在用于每个数据库请求的 。每MSDN

  

DbContext实例表示工作单元和存储库模式的组合,以便它可以用于从数据库查询并将更改组合在一起,然后将其作为一个单元写回

总而言之,这种好处显然不值得花费。

答案 1 :(得分:1)

您不希望在网络应用中执行此操作。为什么?原因有多:

  1. 您可能会在单个线程上锁定所有请求
  2. 会话可能会相互渗透,最终会有一个用户更改另一个用户的数据
  3. 虽然可能看起来多个上下文会影响性能(并使您的编码更加复杂),但在内部处理的事情处理得非常好。

    Windows应用程序怎么样?要看。如果应用程序始终连接,则可能在某些情况下有效。当然比旋转更容易。但是,缺点是它会消耗数据方面的资源,无论是否正在进行任何工作。

    一般来说,我更喜欢更乐观,断断续续的系统。如果那不是您需要的系统(需要,不需要),那么您可以考虑它。但是,作为一项规则,我不会为应用程序提供单个实例。