2011-01-31 62 views
15

我正在使用实体框架操纵数据库中的数据,目前为止已成功。实体框架 - 基础数据(在数据库中)更改通知

但是,我想有多个应用程序在同一时间播放数据(并发版)。

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

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

问候,

尼克

编辑

也许我的问题不太清楚,我会尝试通过一个例子来说明它。

  • 应用程序#1是使用实体框架上数据库#1
  • 应用程序#2也使用实体框架上数据库#1
  • 应用程序#1改变其通过在一个变化来反映所述实体模型数据库的基础表#1
  • 我希望应用程序2得到此更改的通知,以便它可以具有一致的/最新的数据。
+0

很大的问题!同样的问题/问题:http://stackoverflow.com/questions/11627959/entity-framework-data-updates-in-a-multi-user-environment-with-central-database – juFo 2012-07-24 10:39:35

+0

我也有同样的问题 – 2012-12-31 10:17:45

回答

5

也许你应该考虑在你的应用程序EF的使用。EF的情况下应使用的时间最短的时间内尽可能:

  • 创建上下文
  • 加载数据
  • 修改数据
  • 保存数据
  • 下降上下文

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

编辑:

你可以阅读更多关于ObjectContexthere impelementation。

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

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

同样,如果你想降低您所需要的一些服务/中间层,这将允许缓存的某个级别(你也可以尝试WCF数据服务)查询数据传输。

2

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

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

Timestamp-based concurrency control

+1

+1这里最好的办法。您必须使用时间戳,这是进行并发检查的最佳方法,现在EF 4.2自动支持。 – 2012-02-07 12:18:14

0

我不知道你用什么提供商。无论如何,Devart和ODP都支持数据库通知。对于Devart你可以看到下面的链接 OracleDependency Class