实体框架 - 基础数据(在数据库中)更改通知

时间:2011-01-31 15:21:14

标签: entity-framework c#-4.0 notifications

到目前为止,我正在使用Entity Framework来成功操作数据库中的数据。

但是,我希望有多个应用程序同时播放数据(并发版)。

当数据库中的数据发生变化时,有没有办法得到通知?

我看到了使用DML触发器的解决方案,但我想知道是否有其他方法可以实现这一点,如果是,那么使用的最佳解决方案是什么。

此致

尼克

修改

也许我的问题不够明确,我会尝试用一个例子来说明。

  • 应用程序#1正在使用数据库#1
  • 上的实体框架
  • 应用程序#2也在数据库#1上使用实体框架
  • 应用程序#1更改实体模型,该实体模型由数据库#1
  • 的基础表中的更改反映出来
  • 我希望应用程序#2收到有关此更改的通知,以便它可以具有一致/ up2date数据。

4 个答案:

答案 0 :(得分:5)

也许你应该考虑在你的应用程序中使用EF。 EF的上下文应尽可能用于最短的时间段:

  • 创建背景
  • 加载数据
  • 修改数据
  • 保存数据
  • 删除上下文

由于内部实现(IdentityMap,UnitOfWork),长生活环境不是一个好的选择,并且生活环境较短,你根本不需要提到的行为。即使在桌面应用程序中,您也应该使用类似上下文的方法。您加载数据,向用户呈现数据,直到那时只有用户可以修改数据并按下保存按钮 - 应用程序有责任以某种方式处理并发问题(时间戳)。作为运行工作单元的一部分的数据的自动修改是非常糟糕的想法 - 如果用户已经修改了数据怎么办?你会覆盖他的变化吗?

修改

您可以详细了解ObjectContext here的实施情况。

我可以想象需要向客户端应用程序发送数据更新通知的场景。它可以是只读的实时数据显示 - 例如股票交易信息。但在这种情况下,你需要更强大的东西。客户端调用ORM不是获取数据的场景,而是客户端订阅某个服务/中间层处理数据检索和快速更改通知的场景。

对于只需要以半实时方式刷新数据的简单方案,您可以使用轮询 - 您的客户端将在几秒钟内再次调用查询并使用StoreWins策略。任何通知策略都在EF的范围之外 - 您必须将其实现为触发器,sql依赖项,发布订阅模式或其他内容。即使有通知,您也只能处理某些事件并重新查询数据。

再次,如果您想通过轮询减少数据传输,您需要一些服务/中间层,这将允许某种级别的缓存(您也可以尝试WCF数据服务)。

答案 1 :(得分:2)

在数据库级别,您可以在表上放置一个timestamp列,并使用它来判断自检索以来是否已更新行。这可以通过您建议的触发器或C#代码中的监视系统进行检查,或者如果您只想防止覆盖更改,则可以编写检查时间戳的更新sprocs,并使用它们来保存实体。 / p>

无论您选择哪个选项,都必须提前决定如何管理冲突。

Timestamp-based concurrency control

答案 2 :(得分:0)

您可以使用数据库缓存依赖来完成此类操作。

http://msdn.microsoft.com/en-us/library/system.web.caching.sqlcachedependency.aspx
http://msdn.microsoft.com/en-us/magazine/cc188758.aspx

虽然与桌面/服务应用程序相比,当您拥有Web应用程序时,它会变得更复杂。

答案 3 :(得分:0)

我不知道您使用的提供商。无论如何,Devart和ODP都支持DB通知。对于Devart,您可以看到以下链接 OracleDependency Class