到目前为止,我正在使用Entity Framework来成功操作数据库中的数据。
但是,我希望有多个应用程序同时播放数据(并发版)。
当数据库中的数据发生变化时,有没有办法得到通知?
我看到了使用DML触发器的解决方案,但我想知道是否有其他方法可以实现这一点,如果是,那么使用的最佳解决方案是什么。
此致
尼克
修改
也许我的问题不够明确,我会尝试用一个例子来说明。
答案 0 :(得分:5)
也许你应该考虑在你的应用程序中使用EF。 EF的上下文应尽可能用于最短的时间段:
由于内部实现(IdentityMap,UnitOfWork),长生活环境不是一个好的选择,并且生活环境较短,你根本不需要提到的行为。即使在桌面应用程序中,您也应该使用类似上下文的方法。您加载数据,向用户呈现数据,直到那时只有用户可以修改数据并按下保存按钮 - 应用程序有责任以某种方式处理并发问题(时间戳)。作为运行工作单元的一部分的数据的自动修改是非常糟糕的想法 - 如果用户已经修改了数据怎么办?你会覆盖他的变化吗?
修改强>
您可以详细了解ObjectContext
here的实施情况。
我可以想象需要向客户端应用程序发送数据更新通知的场景。它可以是只读的实时数据显示 - 例如股票交易信息。但在这种情况下,你需要更强大的东西。客户端调用ORM不是获取数据的场景,而是客户端订阅某个服务/中间层处理数据检索和快速更改通知的场景。
对于只需要以半实时方式刷新数据的简单方案,您可以使用轮询 - 您的客户端将在几秒钟内再次调用查询并使用StoreWins策略。任何通知策略都在EF的范围之外 - 您必须将其实现为触发器,sql依赖项,发布订阅模式或其他内容。即使有通知,您也只能处理某些事件并重新查询数据。
再次,如果您想通过轮询减少数据传输,您需要一些服务/中间层,这将允许某种级别的缓存(您也可以尝试WCF数据服务)。
答案 1 :(得分:2)
在数据库级别,您可以在表上放置一个timestamp
列,并使用它来判断自检索以来是否已更新行。这可以通过您建议的触发器或C#代码中的监视系统进行检查,或者如果您只想防止覆盖更改,则可以编写检查时间戳的更新sprocs,并使用它们来保存实体。 / p>
无论您选择哪个选项,都必须提前决定如何管理冲突。
答案 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