12

我在 Windows 应用程序中使用 EF,我希望我的应用程序在某个表中插入新记录时执行一些任务“这些新记录将由使用相同数据库的网站插入”
我的问题是如何查看此表更改并在新记录出现时收到通知,在这种情况下 EF 可以帮助我吗?

更新: 我使用了SqlDependency 类并在数据库中使用了它

ALTER DATABASE UrDb SET ENABLE_BROKER

并且还在数据库http://screencast.com/t/vrOjJbA1y中创建了一个服务和一个队列,但我从未从我的 Windows 应用程序中收到通知。
另外,当我在 sql server 中打开队列时,它总是为空http://screencast.com/t/05UPDIwC8ck 接缝表明有问题但我不知道。

4

6 回答 6

2

以下是我的建议:

  1. 如果您能够将重复表添加到数据库,那么这是一个解决方案。你有你的table1table2table1的副本)。当您向table1插入新记录时,您可以将它们与table2中的现有记录进行比较,从而找到新记录。比较后,您应该将所有新记录添加到table2。这是某种同步。这可以通过存储过程或以编程方式进行。

  2. 您不需要任何其他表。您可以将所有数据存储在您的应用缓存中,并在一段时间内(例如 5 秒)检查是否有任何新事件不存在于您的缓存中。如果它们不存在 - 在您的日志或其他地方通知它们并将它们添加到缓存中。但是如果记录太多,处理时间会大大增加+内存消耗。

  3. 如果您能够更改数据库,那么您可以在您的表中添加类似“isNew”列的内容。当新数据来自网站时,该列将是“真”,您的程序可以跟踪这一点,并在处理后为每条记录将此标志设置为假。(如果网站不能设置这个标志,你可以使用SQL TRIGGER AFTER INSERT将标志值设置为true。如果是第三方网站,网站甚至不知道这个功能,或者你不想在那里改变任何东西)

  4. 这是关于 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

于 2013-03-13T10:13:33.470 回答
1

您可以为表创建 SQLCLR 触发器 FOR INSERT。此触发器可以调用您可以在应用程序中托管的简单 WCF 服务。带有触发器的程序集需要在 SQL Server 中注册。看这里怎么做。

另一种方法(最简单的方法):使用普通的 SQL 触发器来监视表的 INSERT 并使用类似“copy nul /Y some_file_with_path.txt”的命令执行 xp_cmdshell 您的应用程序可以使用 FileSystemWatcher 类来监视对同一文件的修改。将过滤器配置为仅监视对该特定文件的最后访问。看这里怎么做。xp_cmdshell 的代理帐户需要在 SQL Server 上定义。

不久前我遇到了同样的问题。我也无法让 SQl Notifications 工作。

于 2013-03-14T22:43:07.367 回答
1

具体参见变更数据捕获sys.fn_cdc_get_max_lsn。这将创造一个寻找变化的地方。

然后,编写一个存储过程来轮询该视图。让它捕获先前的值,并循环寻找WAITFOR延迟适合您的数据到达率的变化。

当程序注意到最高 LSN 发生变化时,让它做一些事情。它可以选择行。它也可以只打印一条消息。然后它返回其投票站(就像它一样)。

打印一条消息可能听起来很奇怪,而且不知道关于 EF 的第一件事(并且对这些事情严重过敏)我不知道它是否会对你有所帮助。但原则上它应该是因为存在底层通信。

从您的应用程序中调用该过程。当过程执行 T-SQL PRINT(或RAISERROR)语句时,将向客户端发送一条消息。我不能说它在 EF 中的位置或您将如何处理它,但它应该放在有用的地方,因为在一般情况下它会显示给用户。在您的情况下,您的应用程序将寻找特定的消息编号或文本,并做出相应的反应。(当然,您希望正常处理其他消息。)

这种方法非常便宜且非常简单。它几乎不使用服务器资源,仅在发生更改时向客户端发送消息,不使用额外的表,几乎不依赖用户编写的代码,并且可以通过查看sysprocesses.

于 2013-03-14T01:29:20.670 回答
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/存档

于 2013-03-05T14:03:13.377 回答
1

存储网站插入的交易信息的交易表怎么样。

在插入表上,您为插入创建了一个触发器,该触发器将新记录放入事务表中。

然后你只需要你的windows应用程序定期检查事务表,当它发现有什么事情做你想做的,然后清除事务表上的记录。

它不是很优雅,但它可能会起作用。我不熟悉 EF,我不知道它是否有更好的解决方案。

于 2013-03-13T20:20:23.833 回答
1

或者使用 SqlTableDependency:https ://tabledependency.codeplex.com/ 。这个开源组件向您发送一个事件,其中包含有关表中新行的记录详细信息

于 2016-06-11T12:02:59.410 回答