静态类中的静态DataServiceContext

时间:2013-09-09 11:30:38

标签: c# entity-framework entity-framework-5 wcf-data-services

我是EF的新手,看来我犯了一个错误,但我想澄清一下。

我的情景:

  • Winforms App(ClickOnce)
  • 一个静态类,其唯一的职责是通过DataServiceContext更新数据库 - 单个URI
  • 整个应用程序中只有一个控件使用此类

使用静态类,我创建了一个DataServiceContext的单个readonly实例。还有一个GetMethod使用上下文中的ToList()获取数据 - 然后该列表用于数据绑定。我只需要简单的CRUD,因此有一个Save / Delete方法,实体被传入并更新。

我已经阅读了更多关于EF的内容,我理解由于并发问题,共享上下文很糟糕。在这种情况下,似乎我会逃避静态上下文,因为每个应用程序实例只会有一个用户访问相同的上下文,或者我会这样做?我想让事情变得尽可能简单。我开始认为也许我应该将静态类转换为常规类,在方法之间共享不可变的DataServiceContext实例作为安全措施?也许我应该在每个通过SaveChanges进行服务调用的方法中应用using(DataServiceContext)来进一步收紧?我现在需要做这些事情还是YAGNI?

由于我在这里自学(没有导师),我可能有擅离职守的危险。我可能需要一些关于EF的基本规则我当前的阅读还没有引导我到现在。请帮忙。

1 个答案:

答案 0 :(得分:3)

这不仅仅是关于并发性(但是:这是一个重要的问题) - 它也是关于正确性的。如果您有一个数据上下文,则存在一些问题:

首先,内存:它会在应用程序的生命周期中慢慢增长,因为更多数据会附加到身份管理器和更改跟踪器中。

其次 - 新鲜度:一旦事物附加到数据上下文,您将看到内存中的对象 - 它可能会停止显示数据库中对象的最新状态

第三 - 腐败:如果出现任何问题,处理的非法方式是简单地回滚任何正在进行的更改,丢弃数据上下文并报告错误和/或重试操作(在新的数据上下文中) );你不能继续使用旧的数据上下文 - 它现在处于未定义状态

由于所有这些原因,一般模式是您仅将数据上下文用作工作单元,以执行单个操作或一组相关/范围操作。之后,将其刻录并重新开始

相关问题