我是 EF 新手,我似乎犯了一个错误,但我想得到澄清。
我的场景:
- Winforms 应用程序 (ClickOnce)
- 静态类,其唯一职责是通过 DataServiceContext - 单个 URI 更新数据库
- 整个应用程序中只有一个控件使用该类
使用静态类,我创建了 DataServiceContext 的单个只读实例。还有一个 GetMethod,它使用上下文中的 ToList() 获取数据 - 然后该列表用于数据绑定(bind)。我只需要简单的 CRUD,因此有一个保存/删除方法,实体被传入并更新。
当我阅读更多有关 EF 的内容时,我了解到共享上下文由于并发问题而很糟糕。在这种情况下,我似乎可以摆脱静态上下文,因为每个应用程序实例只会有一个用户访问相同的上下文,或者我会吗?我想让事情尽可能简单。我开始思考也许我应该将静态类转换为常规类,并在方法之间共享不可变的 DataServiceContext 实例作为保障?也许我应该在每个方法中应用一个 using(DataServiceContext) ,通过 SaveChanges 进行服务调用,以进一步收紧事情?我现在需要做这些事情吗?或者可能是 YAGNI?
由于我在这里自学(没有导师),因此我可能会有擅离职守的危险。我可能需要一些关于 EF 的基本规则,我目前的阅读还没有引导我。请帮忙。
最佳答案
这不仅仅是关于并发性(但是是的:这是一个重要的问题)——它还与正确性有关。如果您只有一个数据上下文,则会出现一些问题:
首先,内存:随着更多数据附加到身份管理器和更改跟踪器中,内存将在应用程序的生命周期中缓慢增长。
其次 - 新鲜度:一旦事物附加到数据上下文,您将看到内存中的对象 - 它可能会停止显示数据库中对象的最新状态
第三 - 损坏:如果出现任何问题,正常的处理方法是简单地回滚任何正在进行的更改,丢弃数据上下文并报告错误和/或重试操作(在新的数据上下文上) );您不能继续使用旧的数据上下文 - 它现在处于未定义状态 由于所有这些原因,一般模式是仅使用数据上下文作为工作单元来执行单个操作或一组相关/范围内的操作。之后,刻录它并重新开始。关于c# - 静态类中的静态 DataServiceContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18697261/