我在Windows应用程序中使用EF,我想我的应用程序做一些任务时插入某个表的新纪录“这些新记录将通过网站使用同一个数据库插入”
我的问题是如何看这个表的变化,当一个新的记录来得到通知,并可以EF帮助我在这种情况下?
更新:我用的SqlDependency类 ,并在数据库中使用此
ALTER DATABASE UrDb SET ENABLE_BROKER
而且还创建了一个服务,并在数据库中的队列http://screencast.com/t/vrOjJbA1y ,但我从来没有从我的Windows应用程序的通知。
另外,当我打开SQL Server中的队列总是空空的http://screencast.com/t/05UPDIwC8ck接缝,有什么不对,但我不知道。
这里是我的主张:
如果你能重复表添加到数据库中,然后在这里是一个解决方案。 你有你的Table 1和Table( 表1的复制)。 当你插入新记录到表1,你可以在你的表2的现有记录加以比较,从而找到新的记录。 比较后,你应该添加所有新记录表2。 这是某种形式的同步。 这可以通过存储过程或编程进行。
你不需要任何其他表。 您可以将所有数据存储在您的应用程序缓存和用的时间(例如5secs)一段时间检查是否有任何新的事件,未在缓存中存在。 如果它们不存在 - 在您的记录通知他们或别的地方,将它们添加到缓存中。 但是,如果有太多记录,处理时间就会大大增加+内存消耗。
如果你能够改变分贝,那么你可以添加类似“是否新款”列到你的表。 当新的数据从网站来了,列将是“真”,你的程序可以跟踪这一点,并处理这个标志设置为false,每条记录之后。 (如果网站不能设置此标志,您可以使用SQL 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 /库/ bb933994.aspx
请参阅变更数据捕获 ,特别是sys.fn_cdc_get_max_lsn
。 这将创建一个地方去寻找变化。
然后,写一个存储过程来查询该视图。 有它捕捉前值和循环寻找一个改变WAITFOR
适合您的数据到达率的延迟。
当程序注意到最高LSN发生了变化,有它做一些事情。 它可以选择行(S)。 它也可以只打印一条消息。 然后它返回到其轮询站(因为它是)。
打印消息听起来奇怪,并且不知道关于EF的第一件事(和受到严重过敏,这样的事情),我不知道这是否会帮助你在这里。 但是,原则上应该是因为底层的通信是存在的。
从应用程序中调用存储过程。 当T-SQL PRINT
(或RAISERROR
)语句是由程序执行时,一个消息将被发送到客户端。 凡进去EF或如何你处理它,我不能说,但它应该去的地方有用,因为在一般情况下,它会显示给用户。 在你的情况,你的申请将寻找特定邮件号码或文字,并做出相应的反应。 (其它消息,当然,你要处理正常。)
这种做法是非常便宜,非常简单。 它几乎不使用服务器资源,发生变化时才将消息发送到客户端,不使用额外的表,依赖于几乎没有用户编写的代码,并且可以被验证为通过查看运行sysprocesses
。
您可以创建一个SQLCLR触发器INSERT表。 该触发器可以调用一个简单的WCF服务,你可以在你的应用程序主机。 需要在SQL Server中注册与触发大会。 见这里如何做到这一点。
另一种方法(最简单的一个):使用普通的SQL触发器,它监视的INSERT表,并用命令类似“复制NUL / Y some_file_with_path.txt”你的应用程序可以使用FileSystemWatcher类,以监视修改同一文件执行xp_cmdshell的。 配置过滤器来监视仅此特定文件的最后访问。 见这里如何做到这一点。 必须SQL Server上定义的代理帐户xp_cmdshell的。
我前一段时间所面临的同样的问题。 我也无法使SQL通知工作。
另一个建议是使用在那里你覆盖的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-是-现在虚重写功能于EF4 / ( 存档 )
如何您存储在网站上插入交易的信息的交易表。
在插入表您创建一个插入触发器,提出一个新的记录在交易表。
然后你只需要你的Windows应用程序来定期检查事务表,当它发现永远做你想要什么东西,然后清除的交易表中的记录。
这是不是很优雅,但它可能工作。 我不熟悉EF,我不知道是否有这更好的解决办法。
或者使用SqlTableDependency: https://tabledependency.codeplex.com/ 。 这个开源组件发送给您的事件与记录详细信息有关表中的新行