我在Windows应用程序中使用EF,我希望我的应用程序在某个表中插入新记录时执行某些任务“这些新记录将由使用相同数据库的网站插入”
我的问题是如何观看此表进行更改并在新记录到来时收到通知,并且在这种情况下EF可以帮助我吗?
更新 我使用 SqlDependency Class 并在db
中使用它 ALTER DATABASE UrDb SET ENABLE_BROKER
并且还在数据库http://screencast.com/t/vrOjJbA1y中创建了一个服务和一个队列,但我从未通过我的Windows应用程序收到通知。
此外,当我在sql server中打开队列时,它始终是空的http://screencast.com/t/05UPDIwC8ck接缝有错误但我不知道。
答案 0 :(得分:2)
以下是我的主张:
如果您能够将重复的表添加到数据库,那么这是一个解决方案。您有 table1 和 table2 ( table1 的副本)。当您将新记录插入 table1 时,您可以将它们与 table2 中的现有记录进行比较,从而找到新记录。比较后,您应将所有新记录添加到 table2 。这是某种同步。这可以通过存储过程或以编程方式进行。
您不需要任何其他表格。您可以将所有数据存储在应用程序缓存中,并检查一段时间(例如5秒)是否存在缓存中不存在的任何新事件。如果它们不存在 - 在日志或其他位置通知它们并将它们添加到缓存中。但如果记录太多,处理时间将大大增加+内存消耗。
如果您能够更改数据库,则可以在表格中添加“isNew”列等内容。当来自网站的新数据时,该列将为“true”,您的程序可以跟踪此数据,并且在处理之后将每个记录的此标志设置为false。 (如果网站无法设置此标志,您可以使用 SQL TRIGGER AFTER INSERT 将标志值设置为true。如果是第三方网站,网站甚至无法了解此功能或者你不想改变任何东西)
以下是有关EF更改跟踪的文章: http://blogs.msdn.com/b/adonet/archive/2009/06/10/poco-in-the-entity-framework-part-3-change-tracking-with-poco.aspx
但问题是你应该通过EF检查整个表格是否会影响你的应用程序性能。
以下是有关SQL Server端更改跟踪和实现概念的有用信息: http://www.mssqltips.com/sqlservertip/1819/using-change-tracking-in-sql-server-2008/ http://msdn.microsoft.com/en-us/library/bb933994.aspx
答案 1 :(得分:1)
另一个建议是使用钩子 在那里覆盖SaveChanges并执行自定义逻辑。
https://stackoverflow.com/a/7654423/989679,https://github.com/kmckelvin/EFHooks/blob/master/EFHooks/HookedDbContext.cs http://thedatafarm.com/blog/data-access/objectcontext-savechanges-is-now-virtual-overridable-in-ef4/(archive)
答案 2 :(得分:1)
如何存储由网站插入的交易信息的交易表。
在插入表上,为insert创建一个触发器,将新记录放入事务表中。
然后你只需要你的Windows应用程序定期检查事务表,当它找到你想要的东西时,然后清除事务表上的记录。
它不是很优雅,但它可能有用。我不熟悉EF,我不知道它是否有更好的解决方案。
答案 3 :(得分:1)
请参阅更改数据捕获,特别是sys.fn_cdc_get_max_lsn
。这将创建一个寻找变化的地方。
然后,编写存储过程以轮询该视图。让它捕获之前的值,并循环查找适合您的数据到达率WAITFOR
延迟的更改。
当程序注意到最高LSN已经改变时,让它做一些事情。它可以选择行。它也可以只打印一条消息。然后它返回其投票站(原样)。
打印信息可能听起来很奇怪,不知道关于EF的第一件事(并且对这些事情严重过敏)我不知道它是否会对你有所帮助。但原则上它应该是因为潜在的沟通存在。
从您的应用程序中,调用该过程。当过程执行T-SQL PRINT
(或RAISERROR
)语句时,将向客户端发送一条消息。如果它进入EF或你如何处理它,我不能说,但它应该某处有用,因为在一般情况下它会显示给用户。在您的情况下,您的应用程序将查找特定的消息编号或文本,并做出相应的反应。 (其他消息,当然,你想要正常处理。)
这种方法非常便宜且非常简单。它几乎不使用任何服务器资源,仅在发生更改时向客户端发送消息,不使用额外的表,几乎不依赖于用户编写的代码,并且可以通过查看sysprocesses
来验证运行。
答案 4 :(得分:1)
您可以创建一个SQLCLR触发器FOR INSERT to table。此触发器可以调用您可以在应用程序中托管的简单WCF服务。具有触发器的程序集需要在SQL Server中注册。请参阅here如何操作。
另一种方法(最简单的方法):使用普通的SQL触发器监视INSERT到表并使用类似“copy nul / Y some_file_with_path.txt”的命令执行xp_cmdshell您的应用程序可以使用FileSystemWatcher类来监视对同一个文件。配置过滤器以仅监视对此特定文件的上次访问。请参阅here如何操作。需要在SQL Server上定义xp_cmdshell的代理帐户。
前一段时间我遇到了同样的问题。我也无法使SQl通知工作。
答案 5 :(得分:1)
或者使用SqlTableDependency:https://tabledependency.codeplex.com/。此开源组件向您发送一个事件,其中包含有关表
中新行的记录详细信息