6

Hầu hết các ví dụ tôi đã thấy trực tuyến cho thấy theo dõi thay đổi đối tượng trong ngữ cảnh WinForms/WPF. Hoặc nếu nó trên web, các đối tượng được kết nối được sử dụng, do đó, các thay đổi được thực hiện cho mỗi đối tượng có thể được theo dõi.Thực hiện theo dõi thay đổi đối tượng trong ứng dụng WCF MVC N-Tier

Trong kịch bản của tôi, các đối tượng đang bị ngắt kết nối khi họ rời khỏi lớp dữ liệu (Mapped thành các đối tượng kinh doanh trong WCF, và ánh xạ vào DTO về việc áp dụng MVC)

Khi người dùng thay đổi các đối tượng trên MVC (ví dụ, thay đổi 1 thuộc tính trường), làm cách nào để gửi thay đổi đó từ Chế độ xem, tất cả các con đường xuống DB?

Tôi muốn có bảng kiểm tra, lưu các thay đổi được thực hiện cho một đối tượng cụ thể. Những gì tôi muốn lưu là các giá trị trước & sau của một đối tượng duy nhất cho các thuộc tính mà chúng ta sửa đổi

tôi có thể nghĩ ra một số cách để làm điều này

1) Thực hiện một lá cờ IsDirty cho mỗi tài sản cho tất cả các mô hình trong lớp MVC (hoặc trong javascript?). Tuyên truyền thông tin đó trở lại tầng dịch vụ và cuối cùng là lớp dữ liệu.

2) Có cơ chế theo dõi thay đổi này trong lớp dịch vụ sẽ là tuyệt vời, nhưng làm cách nào để theo dõi giá trị "gốc" sau khi các giá trị sửa đổi đã được trả về từ MVC?

3) Trình kích hoạt cơ sở dữ liệu? Nhưng tôi không chắc chắn làm thế nào để bắt đầu. Điều này thậm chí có thể?

Có bất kỳ triển khai theo dõi thay đổi đối tượng đã biết nào ở đó cho giải pháp mvc-wcf n-tier không?

Ví dụ về bảng kiểm toán:

Audit table 

Id    Object   Property   OldValue    NewValue 
-------------------------------------------------------------------------------------- 
1    Customer  Name    Bob      Joe 
2    Customer  Age    21      22 
+0

+1 ** Khi người dùng thực hiện thay đổi đối tượng trên MVC (ví dụ: thay đổi 1 thuộc tính trường), làm cách nào để gửi thay đổi đó từ Chế độ xem, tất cả xuống đến DB? ** Bạn có thể giải thích điều này không? ? –

+0

Chỉnh sửa để làm rõ hơn –

+0

Chỉ cần ánh xạ trở lại các lớp ORM (Entity Framework?) Và gọi 'SaveChanges()'. Câu hỏi của bạn là gì? –

Trả lời

3

giải pháp có thể cho vấn đề này sẽ phụ thuộc phần lớn vào những gì thay đổi bạn cho phép trong cơ sở dữ liệu khi người dùng đang chỉnh sửa dữ liệu.

Trong các từ khác, khi nó "rời" cơ sở dữ liệu, nó có bị khóa riêng cho người dùng hoặc người dùng khác hoặc quá trình cập nhật nó trong thời gian chờ đợi không? Ví dụ: nếu người dùng có thể lấy dữ liệu và ngồi trên đó trong vài giờ hoặc vài ngày, nhưng cơ sở dữ liệu tiếp tục cho phép cập nhật dữ liệu, thì bạn thực sự muốn theo dõi những thay đổi mà người dùng đã thực hiện đối với phiên bản hiện tại trong cơ sở dữ liệu, không phải là những thay đổi mà người dùng đã thực hiện đối với dữ liệu họ đang xem. Cách chúng tôi xử lý kịch bản này là bắt đầu một giao dịch, đọc toàn bộ đối tượng hiện có, và sau đó sử dụng sự phản chiếu để so sánh các giá trị cũ và mới, ghi nhật ký các thay đổi vào nhật ký kiểm tra. Điều này có một chút phức tạp khi xử lý các bản ghi lồng nhau, nhưng cũng đáng để dành thời gian thực hiện.

Nếu mặt khác, không có người dùng hoặc quy trình nào khác được phép thay đổi dữ liệu, thì bạn có một vài tùy chọn khác nhau về độ phức tạp, lưu trữ dữ liệu và tác động đến cấu trúc dữ liệu hiện có. Ví dụ, bạn có thể sửa đổi từng thuộc tính trong mỗi lớp của bạn để ghi lại khi nó đã thay đổi và duy trì một số kiểm tra thay đổi trong lớp (rõ ràng là việc triển khai lớp cơ sở giúp đáng kể ở đây).

Tuy nhiên, tùy thuộc vào thời điểm bạn nắm bắt các thay đổi của người dùng (ví dụ: mỗi khi họ cập nhật trường trong biểu mẫu), điều này có thể tạo ra một lượng đáng kể thông tin nhật ký không hữu ích vì bạn có thể chỉ muốn biết những gì đã thay đổi từ quan điểm cơ sở dữ liệu, không phải từ phối cảnh giao diện người dùng.

Bạn cũng có thể sao chép sâu đối tượng và truyền xung quanh các lớp. Sau đó, khi đó là thời gian để xác định những gì đã thay đổi, bạn lại có thể sử dụng sự phản chiếu. Tuy nhiên, tùy thuộc vào kích thước của các đối tượng kinh doanh của bạn, cách tiếp cận này có thể áp đặt một hình phạt hiệu suất khổng lồ vì một bản sao hoàn chỉnh phải được chuyển qua dây và giữ lại với bản ghi gốc.

Bạn cũng có thể triển khai phương pháp tương tự như phương pháp "cập nhật được phép trong khi chỉnh sửa". Điều này, trong tâm trí của tôi, là giải pháp sạch nhất vì dữ liệu gốc không phải di chuyển với dữ liệu đã chỉnh sửa, không có khả năng giả mạo dữ liệu gốc và nó hỗ trợ nhiều khách hàng mà không cần phải hỗ trợ theo dõi thay đổi trong giao diện người dùng cấp độ.

+0

Không, không có gì đang bị khóa. Những người dùng khác có thể chỉnh sửa cùng một dữ liệu. –

+0

Ok, sau đó tôi chắc chắn khuyên bạn nên truy xuất bản ghi gốc khi bắt đầu cùng một giao dịch mà bạn sử dụng để cập nhật bản ghi. Chúng tôi sử dụng rất nhiều trong một hệ thống có hàng nghìn người dùng đồng thời gửi dữ liệu qua máy khách web, thiết bị di động, email, ứng dụng hình thức giành chiến thắng, v.v. Tất cả dữ liệu từ tất cả khách hàng đều đi qua một điểm choke trong lớp ứng dụng và đây là nơi chúng tôi thực hiện kiểm toán như được mô tả. –

+0

Vì vậy, bạn đang nói, tôi nên làm một cái gì đó như thế này: Ví dụ: người dùng muốn chỉnh sửa dữ liệu của Khách hàng. 1) truy xuất dữ liệu của khách hàng từ lớp dịch vụ (WCF). 2) thay đổi 1 thuộc tính (ví dụ: tên) 3) khi lưu (gửi dữ liệu trở lại lớp dịch vụ), truy xuất lại bản ghi và thực hiện so sánh? –

0

Có hai phần cho câu hỏi của bạn:

  1. Làm thế nào để làm điều đó trong MVC:

Cách thông thường: bạn gửi những thay đổi lại cho máy chủ, một bộ điều khiển xử lý chúng, vv .vv .. Không có gì bất thường trong trường hợp sử dụng của bạn, nhiệm vụ thay đổi cách MVC thường hoạt động. Tốt hơn cho trường hợp sử dụng của bạn cho các thay đổi được mã hóa thành các hoạt động thay đổi riêng lẻ, không phải là đối tượng đã sửa đổi, bạn cần sử dụng sự phản chiếu để tìm ra thay đổi nào nếu người dùng thực hiện.

  1. Làm thế nào để làm điều đó trên cơ sở dữ liệu: Đây có lẽ là câu hỏi dự định của bạn:

Trước hết hãy tránh xa khuôn khổ ORM, cuộc sống là quá phức tạp vì nó.

Trên bước cuối cùng của lưu hoạt động, bạn nên có các thông tin sau:

  • Các đối tượng và các lĩnh vực mà cần phải thay đổi và những giá trị mới của họ.

Bạn cần phải theo dõi các thông tin sau:

  • gì thay đổi cuối cùng với đối tượng bạn có ý định sửa đổi trong cơ sở dữ liệu.

Điều này có thể lấy từ bảng Kiểm tra và cần phải được lưu trong Phiên (hoặc Phiên như đối tượng).

Sau đó, bạn cần phải làm như sau trong một giao dịch:

  • Lấy sự thay đổi cuối cùng để các đối tượng (s) being sửa đổi từ cơ sở dữ liệu.
  • Nếu các đối tượng đã thay đổi hủy và thông báo cho người dùng về xung đột.
  • Nếu không nhận được giá trị hiện tại của các trường đang được thay đổi.
  • Lưu các giá trị mới.
  • Cập nhật bảng Kiểm tra.

Tôi sẽ sử dụng quy trình được lưu trữ để làm cho quy trình ít trò chuyện hơn và để phân tách mối quan tâm giữa mã cơ sở dữ liệu và mã ứng dụng.

+0

Làm cách nào để theo dõi thay đổi đối tượng mà tôi dự định sửa đổi trong cơ sở dữ liệu? Điều này có đề nghị tôi triển khai một cờ isDirty tất cả các cách tại ViewModel của lớp MVC, và vượt qua nó tất cả các cách trở lại lớp dữ liệu? –

+0

1. Không, bạn đã có Kiểm toán, nếu bạn cần thay đổi ID khách hàng = 12, chỉ cần ghi lại ID của sửa đổi cuối cùng cho đối tượng đó trong theo dõi kiểm toán. 2. Đối với trường hợp sử dụng của bạn, bạn cần phải có một cách để xác định trường nào đã thay đổi. Đây có thể là một lá cờ bẩn thỉu, nhưng sẽ hiệu quả hơn nếu có nhật ký thay đổi: Một đối tượng đóng gói các thay đổi, ví dụ: Khách hàng: 10, Trường: Tên, Giá trị: Bob. Những điều này sẽ trực tiếp dịch sang những thay đổi trong cơ sở dữ liệu. –

+0

Câu hỏi. Bạn nói "Trước hết hãy tránh xa các khuôn khổ ORM, cuộc sống quá phức tạp như nó." - Làm thế nào để bạn tiếp tục thay đổi? Viết sql cho mình? Hoặc sử dụng DataTables? – Maarten

Các vấn đề liên quan