2013-02-05 22 views
9

Không chắc chắn cách đặt câu hỏi này nhưng ở đây nó đi. Tôi đang làm việc trên một dự án mà nhiều ứng dụng khách đang truy cập vào một nguồn dữ liệu thông qua một dịch vụ WCF. Nó có thể không liên quan nhưng dịch vụ WCF đang sử dụng khung thực thể để truy cập nguồn dữ liệu này. Bất cứ khi nào một khách hàng đã truy vấn một bản ghi để chỉnh sửa, tôi muốn ngăn chặn bản ghi đó được chỉnh sửa bởi phần còn lại của khách hàng cho đến khi khách hàng đầu tiên đã hoàn tất cập nhật của họ.Thực hành tốt nhất để khóa bản ghi để chỉnh sửa trong khi sử dụng khung tổ chức

Sửa lỗi nếu tôi sai nhưng tôi tin rằng điều này còn được gọi là truy cập dữ liệu đồng bộ và không đồng bộ.

Câu hỏi của tôi là, thực tiễn tốt nhất trong ngành để triển khai chức năng này là gì. Có cách nào để kiểm soát điều này từ phía cơ sở dữ liệu (Sử dụng SQL) hay nó phải được thực hiện thông qua máy khách?

Tôi đã xem xét bao gồm cột 'EditMode' boolean cho mỗi bảng và chỉ cần đặt thành true khi được chỉnh sửa và kiểm tra xem điều đó có được đặt thành true trước khi cho phép ứng dụng khách khác truy cập vào bản ghi đó hay không.

Trả lời

6

Thực tiễn tốt nhất là sử dụng khóa RowVersion và Optimistic.

Optimistic Concurrency Patterns giải thích.

Nếu sử dụng Mã trước, hãy bao gồm một trường trong POCO của bạn.

public virtual byte[] RowVersion { get; set; } 

EF sẽ thêm thuộc tính Dấu thời gian/RowVersion vào bảng của bạn. Nó sẽ được kiểm tra trong quá trình cập nhật. Và tự động cập nhật bởi DB khi thay đổi.

EDIT: để giải thích rõ hơn.

Những gì EF đang tìm kiếm là thuộc tính là trường đồng thời, do đó bạn thực sự có thể kiểm soát đồng thời với một hoặc nhiều trường.

entity.Property(p => p.RowVersion).IsConcurrencyToken() 

khi thực hiện một nâng cấp hoặc xóa bạn nắm bắt những ngoại lệ được định nghĩa

catch (DbUpdateConcurrencyException ex) 

EF xử lý các rowversion như một mã thông báo đồng thời. Đây là cách tiếp cận thường được sử dụng. Vì SQLServer sẽ tự động cập nhật loại trường này cho bạn. Rất nhanh và dễ dàng. Nhưng bạn có thể nói cho EF một tài sản là một mã thông báo đồng thời một cách rõ ràng và có nhiều hơn một.

Vì vậy, EF nên thêm thuộc tính vào mệnh đề where để cập nhật và xóa để đảm bảo bản ghi không thay đổi kể từ khi được truy cập.

+0

Cảm ơn bạn, điều này dường như chính xác là những gì tôi cần. Tôi không chắc nó được biết đến như thế nào để tự mình làm nghiên cứu. –

+0

@phil soday - Nếu mã sử dụng của bạn trước hết và bạn đặt dòng đó trong miền của bạn, nó có tự động biết để thực hiện khóa RowVersion không? Nó có phải được gọi là RowVersion không? Nó có ném một ngoại lệ hay nó hoạt động như thế nào? – chobo2

+0

Điều này dường như là những gì tôi cần cũng như howver tôi không sử dụng mã đầu tiên. Tôi vẫn đang sử dụng EF5 edmx là cách để thực hiện tiis điều gì xảy ra nếu người dùng b thực hiện thay đổi trước khi người dùng lưu – rogue39nin

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