tôi nhận được lỗi này nếu tôi làm theo các bước sau:Các thành viên 'X' đã được thay đổi không phù hợp với các thành viên hiệp hội 'Y'
- Thay đổi sở hữu Y của một đối tượng (một tài sản thực thể liên quan)
- Cố gắng gửi thay đổi
- Tại thời điểm này giá trị của Y và giá trị của X (khóa cơ bản) không có trong thỏa thuận - LINQ to SQL dường như không đồng bộ hóa những điều này cho đến khi GetChangeSet được gọi.
- Lỗi dự kiến xảy ra do một số logic nghiệp vụ hoặc hạn chế mức cơ sở dữ liệu trong quá trình cập nhật.
- Tại thời điểm này giá trị của Y tương ứng với X vì GetChangeSet được gọi.
- Thay đổi giá trị của Y thành Không có gì (aka null).
- Gọi GetChangeSet.
Lỗi xảy ra ở bước cuối cùng vì giá trị của X và giá trị ban đầu của X (được trả về bởi GetOriginalEntityState) khác nhau và giá trị mới không đồng ý với Y? Đó có phải là lý do tại sao? Đây có phải là một lỗi trong LINQ to SQL. Phải là vì tôi không thấy cùng một hành vi nếu tôi thay đổi Y thành giá trị khác (không phải null) thay vì trong bước 5. Cách nào đúng đắn? Tôi có thể thấy một vài cách:
- Hủy DataContext khi xảy ra lỗi và rời khỏi giao diện người dùng. Tôi không thích điều này bởi vì sau đó không thể phát hiện xung đột thay đổi coccoin lạc quan. Ngữ cảnh mới không có các giá trị ban đầu trong nó được điền cùng lúc với giao diện người dùng, vì vậy nếu giao diện người dùng có bất kỳ giá trị cũ nào trong đó, chúng sẽ khiến dữ liệu trong cơ sở dữ liệu hoàn nguyên.
- Làm mới datacontext (OverwriteCurrent) và để nguyên giao diện người dùng. Tôi không thích điều này vì lý do tương tự như # 1.
- Làm mới datacontext (OverwriteCurrent) và điền lại giao diện người dùng. Tôi không thích điều này bởi vì sau đó thông báo lỗi vừa được trình bày cho người dùng không hiển thị cho người dùng lỗi họ đã tạo và cho phép họ sửa lỗi đó. Nó cũng loại bỏ tất cả các thay đổi khác mà người dùng có thể đã thực hiện.
- Khi lỗi xảy ra, hãy truy xuất khóa cho Y tương ứng với giá trị gốc của X và đặt lại Y, sau đó gọi hàm GetChangeSet để đồng bộ hóa X (X chỉ đọc hoặc riêng tư để tôi không thể đặt lại khóa đó trực tiếp). Điều này dường như hoạt động, nhưng có vẻ như một hack, và có thể yêu cầu rất nhiều mã cho các lỗi tương tự khác.
Có giải pháp nào tốt hơn không. Đây có phải là thứ cần được báo cáo không?
Bạn có thể làm rõ ý bạn bằng "2. Tại thời điểm này, giá trị của Y và giá trị của X (khóa cơ bản) không đồng ý". Chắc chắn bạn không thay đổi thuộc tính khóa chính của thực thể, nhưng một số trường khác, phải không? –
Phải. Giả sử tôi có một đối tượng Order, và một trong các thuộc tính được gọi là Customer cho biết khách hàng nào đã đặt hàng. Điều này đại diện cho Y. Liên kết đó được thể hiện dưới sự che phủ của một thuộc tính ẩn như _CustomerId. Điều này đại diện cho X. Tôi có thể thay đổi khách hàng được liên kết với đơn đặt hàng. Khách hàng sẽ tham khảo đối tượng Khách hàng mới, nhưng _CustomerId sẽ không phản ánh giá trị _Id của Khách hàng nội bộ cho đến khi GetChangeSet được gọi. – BlueMonkMN