2013-03-05 6 views
12

Tôi đang sử dụng EF trong một ứng dụng cửa sổ và tôi muốn ứng dụng của mình thực hiện một số tác vụ khi bản ghi mới được chèn vào một bảng nhất định. cùng một db "
Câu hỏi của tôi là cách xem bảng này để biết các thay đổi và được thông báo khi có hồ sơ mới và EF có thể giúp tôi trong trường hợp này không?Xem hồ sơ mới trong cơ sở dữ liệu sql

UPDATE: tôi đã sử dụng SqlDependency Lớp và sử dụng này trong db

ALTER DATABASE UrDb SET ENABLE_BROKER

Và cũng tạo ra một dịch vụ và một hàng đợi trong cơ sở dữ liệu http://screencast.com/t/vrOjJbA1y nhưng tôi không bao giờ nhận được thông báo từ tôi cửa sổ ứng dụng.
Ngoài ra khi tôi mở hàng đợi trong máy chủ sql nó luôn luôn rỗng http://screencast.com/t/05UPDIwC8ck đường nối có điều gì đó sai trái nhưng tôi không biết.

+0

Có thể bạn đang tìm kiếm ['SqlDependency'] (http://msdn.microsoft.com/en-us/library/system .data.sqlclient.sqldependency.aspx), và không có gì tích hợp vào EF hỗ trợ điều này. –

+2

bạn đã thử kích hoạt cho bảng của mình chưa – saeed

+2

Bạn có cho rằng [Sử dụng Cơ sở dữ liệu dưới dạng IPC] (http://en.wikipedia.org/wiki/Database-as-IPC) là một mô hình chung không? – Aron

Trả lời

2

Dưới đây là mệnh đề của tôi:

  1. Nếu bạn có thể để thêm bảng cơ sở dữ liệu trùng lặp để thì đây là một giải pháp. Bạn có bảng1bảng2 (Bản sao của table1). Khi bạn chèn bản ghi mới vào table1, bạn có thể so sánh chúng với các bản ghi hiện có trong bảng2 của bạn và do đó tìm bản ghi mới. Sau khi so sánh, bạn nên thêm tất cả các bản ghi mới vào table2. Đây là một số loại đồng bộ hóa. Điều này có thể được thực hiện thông qua proc được lưu trữ hoặc lập trình.

  2. Bạn không cần bất kỳ bảng nào khác. Bạn có thể lưu trữ tất cả dữ liệu trong bộ nhớ cache của ứng dụng và kiểm tra một khoảng thời gian (ví dụ 5 giây) có bất kỳ sự kiện mới nào không tồn tại trong bộ nhớ cache của bạn. Nếu chúng không tồn tại - hãy thông báo cho chúng trong nhật ký của bạn hoặc ở nơi khác và thêm chúng vào bộ nhớ cache. Nhưng nếu có quá nhiều hồ sơ, thời gian xử lý sẽ tăng lên đáng kể + tiêu thụ bộ nhớ.

  3. Nếu bạn có thể thay đổi db thì bạn có thể thêm thứ gì đó như cột 'mới' vào bảng của mình. Khi một dữ liệu mới đến từ trang web, cột sẽ là 'true', chương trình của bạn có thể theo dõi điều này và sau khi xử lý đặt cờ này thành false cho mỗi bản ghi. (Nếu trang web không thể đặt cờ này, bạn có thể sử dụng SQL TRIGGER AFTER INSERT để đặt giá trị cờ thành true. Trang web thậm chí không thể biết về tính năng này nếu đó là trang web của bên thứ ba hoặc bạn không muốn thay đổi bất cứ điều gì có)

  4. Dưới đây là bài viết về EF thay đổi theo dõi: http://blogs.msdn.com/b/adonet/archive/2009/06/10/poco-in-the-entity-framework-part-3-change-tracking-with-poco.aspx

Nhưng vấn đề là bạn nên kiểm tra toàn bộ bảng cho những thay đổi qua EF rằng sẽ đạt hiệu suất ứng dụng của bạn.

Dưới đây là thông tin hữu ích về các khái niệm SQL Server theo dõi và thực hiện sự thay đổi bên: http://www.mssqltips.com/sqlservertip/1819/using-change-tracking-in-sql-server-2008/ http://msdn.microsoft.com/en-us/library/bb933994.aspx

1

Làm thế nào về một bảng giao dịch nơi bạn lưu trữ các thông tin về giao dịch chèn bởi trang web.

Trên bảng chèn, bạn tạo trình kích hoạt để chèn để đặt bản ghi mới trong bảng giao dịch.

Sau đó, bạn chỉ cần ứng dụng cửa sổ của mình định kỳ kiểm tra bảng giao dịch, khi tìm thấy thứ gì đó làm những gì bạn muốn và sau đó xóa bản ghi trên bảng giao dịch.

Nó không phải là rất thanh lịch, nhưng nó có thể làm việc. Tôi không quen thuộc với EF và tôi không biết nếu nó có một giải pháp tốt hơn cho việc này.

1

Xem Thay đổi thu thập dữ liệu, cụ thể là sys.fn_cdc_get_max_lsn. Điều đó sẽ tạo ra một nơi để tìm kiếm những thay đổi.

Sau đó, viết thủ tục đã lưu để thăm dò ý kiến ​​đó. Có nó nắm bắt giá trị trước đó, và vòng lặp tìm kiếm một sự thay đổi với một sự chậm trễ WAITFOR thích hợp với tỷ lệ đến dữ liệu của bạn.

Khi thủ tục thông báo LSN cao nhất đã thay đổi, hãy làm điều gì đó. Nó có thể chọn (các) hàng. Nó cũng có thể chỉ in một tin nhắn. Sau đó, nó trở lại trạm bỏ phiếu của nó (như nó đã được).

In tin nhắn có vẻ kỳ quặc và không biết điều đầu tiên về EF (và bị dị ứng nghiêm trọng với những thứ như vậy) Tôi không biết liệu nó có giúp bạn ở đây hay không. Nhưng về nguyên tắc nó phải là vì thông tin cơ bản hiện diện.

Từ ứng dụng của bạn, hãy gọi thủ tục. Khi câu lệnh T-SQL PRINT (hoặc RAISERROR) được thực hiện theo quy trình, một thông báo sẽ được gửi đến máy khách. Trường hợp nó đi trong EF hoặc làm thế nào bạn muốn xử lý nó, tôi không thể nói, nhưng nó nên đi một nơi nào đó hữu ích vì trong hoàn cảnh bình thường nó sẽ được hiển thị cho người dùng. Trong trường hợp của bạn, ứng dụng của bạn sẽ tìm kiếm số tin nhắn hoặc văn bản cụ thể đó và phản ứng tương ứng. (Các tin nhắn khác, tự nhiên, bạn muốn xử lý bình thường.)

Cách tiếp cận này rất rẻ và rất đơn giản. Nó hầu như không có tài nguyên máy chủ, chỉ gửi thông điệp cho khách hàng khi thay đổi xảy ra, không sử dụng thêm bảng nào, dựa vào hầu như không có mã do người dùng viết và có thể được xác minh là đang chạy bằng cách xem sysprocesses.

1

Bạn có thể tạo trình kích hoạt SQLCLR cho INSERT vào bảng. Trình kích hoạt này có thể gọi một Dịch vụ WCF đơn giản mà bạn có thể lưu trữ trong ứng dụng của mình. Việc lắp ráp với kích hoạt cần phải được đăng ký trong SQL Server. Xem here cách thực hiện.

Cách tiếp cận khác (cách đơn giản nhất): sử dụng trình kích hoạt SQL thông thường để giám sát INSERTs tới bảng và thực hiện lệnh xp_cmdshell bằng lệnh như "copy nul/Y some_file_with_path.txt" Ứng dụng của bạn có thể sử dụng lớp FileSystemWatcher để xem các sửa đổi cùng một tệp. Định cấu hình bộ lọc để chỉ xem quyền truy cập lần cuối vào tệp cụ thể này. Xem here cách thực hiện. Tài khoản proxy cho xp_cmdshell cần phải được xác định trên SQL Server.

Tôi đã gặp phải vấn đề tương tự cách đây một thời gian. Tôi cũng không thể thực hiện Thông báo SQl.

1

Hoặc sử dụng SqlTableDependency: https://tabledependency.codeplex.com/. Thành phần nguồn mở này gửi cho bạn một sự kiện có thông tin chi tiết về bản ghi về hàng mới trong bảng