12

WindowsアプリケーションでEFを使用していますが、特定のテーブルに新しいレコードが挿入されたときにアプリケーションにいくつかのタスクを実行させたいのですが、「これらの新しいレコードは、同じデータベースを使用してWebサイトによって挿入されます」
私の質問は、このテーブルを監視する方法ですこの場合、EF は私を助けることができますか?

更新: SqlDependency クラスを 使用し、これをデータベースで使用しました

ALTER DATABASE UrDb SET ENABLE_BROKER

また、データベースhttp://screencast.com/t/vrOjJbA1yにサービスとキューを作成しましたが、Windows アプリケーションから通知を受けることはありません。
また、SQLサーバーでキューを開くと、常に空ですhttp://screencast.com/t/05UPDIwC8ck 何か問題があるという縫い目ですが、わかりません。

4

6 に答える 6

2

ここに私の提案があります:

  1. 重複したテーブルをデータベースに追加できる場合は、ここに解決策があります。table1table2 ( table1のコピー) があります。新しいレコードをtable1に挿入すると、それらをtable2の既存のレコードと比較して、新しいレコードを見つけることができます。比較した後、すべての新しいレコードをtable2に追加する必要があります。これはある種の同期です。これは、ストアド プロシージャまたはプログラムによって行うことができます。

  2. 別のテーブルは必要ありません。すべてのデータをアプリのキャッシュに保存し、キャッシュに存在しない新しいイベントがあるかどうかを一定時間 (たとえば 5 秒) 確認できます。それらが存在しない場合は、ログまたは他の場所で通知し、キャッシュに追加します。ただし、レコードが多すぎると、処理時間が大幅に増加し、メモリ消費量が増加します。

  3. データベースを変更できる場合は、「isNew」列のようなものをテーブルに追加できます。Web サイトから新しいデータが送信されると、列は「true」になり、プログラムでこれを追跡できます。処理後、レコードごとにこのフラグを false に設定します。(Web サイトでこのフラグを設定できない場合は、SQL TRIGGER AFTER INSERTを使用してフラグの値を true に設定できます。サードパーティの Web サイトであるか、そうしたくない場合、Web サイトはこの機能について知ることさえできません。そこで何かを変更します)

  4. EF の変更の追跡に関する記事は次のとおりです 。 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

特に、ChangeDataCaptureを参照してくださいsys.fn_cdc_get_max_lsn。これにより、変更を探す場所が作成されます。

次に、そのビューをポーリングするストアドプロシージャを記述します。以前の値をキャプチャしてWAITFOR、データ到着率に適した遅延で変更をループして探します。

最高のLSNが変更されたことに手順が気付いたら、何かを実行してもらいます。行を選択できます。メッセージを印刷することもできます。その後、投票所に戻ります(いわば)。

メッセージを印刷することは奇妙に聞こえるかもしれません、そして、EFについての最初のことを知らない(そしてそのようなことに対してひどくアレルギーがある)私はそれがここであなたを助けるかどうかわかりません。しかし、原則として、基礎となるコミュニケーションが存在するため、そうする必要があります。

アプリケーションから、プロシージャを呼び出します。T-SQL PRINT(またはRAISERROR)ステートメントがプロシージャによって実行されると、メッセージがクライアントに送信されます。EFのどこに行くのか、どのように扱うのかはわかりませんが、通常の状況ではユーザーに表示されるので、どこか便利な場所に行く必要があります。あなたの場合、アプリケーションはその特定のメッセージ番号またはテキストを探し、それに応じて反応します。(他のメッセージは、当然、通常どおり処理する必要があります。)

このアプローチは非常に安価で非常に簡単です。サーバーリソースをほとんど使用せず、変更が発生した場合にのみクライアントにメッセージを送信し、追加のテーブルを使用せず、ユーザー作成のコードにほとんど依存せず、を確認することで実行中であることを確認できますsysprocesses

于 2013-03-14T01:29:20.670 に答える
1

もう 1 つの提案は、SaveChanges をオーバーライドしてカスタム ロジックを実行するフックを使用することです。

https://stackoverflow.com/a/7654423/989679https://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

テーブルへの SQLCLR トリガー FOR INSERT を作成できます。このトリガーは、アプリケーションでホストできる単純な WCF サービスを呼び出すことができます。トリガーを含むアセンブリを SQL Server に登録する必要があります。やり方はこちらをご覧ください。

別のアプローチ (最も単純な方法): 通常の SQL トリガーを使用して、テーブルへの INSERT を監視し、「copy nul /Y some_file_with_path.txt」のようなコマンドで xp_cmdshell を実行します。アプリケーションは FileSystemWatcher クラスを使用して、同じファイルへの変更を監視できます。この特定のファイルへの最終アクセスのみを監視するようにフィルターを構成します。やり方はこちらをご覧ください。xp_cmdshell のプロキシ アカウントを SQL Server で定義する必要があります。

少し前に同じ問題に直面しました。また、SQL 通知を機能させることもできませんでした。

于 2013-03-14T22:43:07.367 に答える
1

Web サイトによって挿入されたトランザクションの情報を格納するトランザクション テーブルはどうでしょうか。

挿入テーブルで、新しいレコードをトランザクション テーブルに挿入するためのトリガーを作成します。

次に、Windowsアプリがトランザクションテーブルを定期的にチェックするだけで、必要なことを見つけてトランザクションテーブルのレコードをクリアするだけです。

あまりエレガントではありませんが、うまくいくかもしれません。私は EF に精通していないため、これに対するより良い解決策があるかどうかはわかりません。

于 2013-03-13T20:20:23.833 に答える