实体框架上下文管理

时间:2011-06-13 21:14:35

标签: entity-framework events entity-framework-4

我对实体框架上下文实例管理有一些疑问。

我的代码库由许多独立的组件/代理组成,所有组件/代理都在一个进程中运行,只能在方便时从相应的队列中读取消息(每当组件准备好时,它将从中获取下一条消息)排队,因此在组件级别没有并发问题)

每个组件都需要独立于其他组件与数据库交互。我想知道为每个组件设置上下文实例的更好方法是什么。以下是一些选项

1>拥有所有组件使用的上下文的一个实例。 - >我认为这是最糟糕的,因为它会产生许多并发问题?

2 - ;为每个组件提供上下文的独立实例。 - >这看起来不错,但

  • 是否可以在一个流程中拥有多个与上下文无关的实例,而所有组件在此流程中并发运行?

  • 我是否应该为组件处理的每个新消息创建一个新的上下文实例,或者为组件的生命周期保留一个上下文实例?我认为最后一个更有意义,但我更习惯在using {}括号中使用上下文,我不确定在每个组件的生命周期中保留一个上下文是否与我使用它的方式有任何复杂性? / p>

  • 我可以依赖乐观的一致性,以便两个不同的独立组件不会在数据库中放入相同的记录,因为所有上下文都在一个进程中吗?

BTW,我正在使用实体框架4.1。

1 个答案:

答案 0 :(得分:3)

每个组件/代理肯定使用一个上下文 - 如果组件是多线程的,则每个线程使用一个上下文。如果每个消息处理作为单独的“逻辑事务”执行,则每个消息处理使用一个上下文。

为什么:

  • Context在内部使用两种非常重要的设计模式 - 身份映射和工作单元。 This answer描述了这些模式强制执行的行为。
  • 上下文和EF中的任何其他内容都不是线程安全的。

乐观并发并不意味着不同的上下文不会在数据库中放入相同的记录。乐观并发意味着更新语句将数据库中的当前状态与上下文的最后已知状态进行比较(加载记录和保存新值之间存在延迟,另一个上下文可以更改记录)。如果记录改变了,你将得到一个例外,你必须以某种方式处理它。