2012-01-31 26 views
7

Tôi đã sử dụng rất nhiều Khuôn khổ thực thể trong một ứng dụng MVVM WPF gần đây và tôi gặp phải một số vấn đề. Để hiển thị dữ liệu, các mô hình xem của tôi đang sử dụng ObjectContext có thời lượng ngắn. Các mô hình xem này sẽ được sử dụng trong một quy trình chạy dài, do đó tôi thích sử dụng ObjectContext ngắn để không làm giảm hiệu suất.Khuôn khổ thực thể không theo dõi thay đổi bộ sưu tập khi kết nối lại một thực thể

Vì vậy, về cơ bản nó có nghĩa là các thực thể của tôi được tiêu thụ ở chế độ ngắt kết nối. Những entites này có thể được tạo, xem, cập nhật và xóa. Tôi không gặp vấn đề gì khi lưu các thay đổi về cơ sở dữ liệu bằng chế độ ngắt kết nối. Nhưng tôi đã tìm thấy một trường hợp cụ thể trong đó các thay đổi không được lưu mà không có lỗi hiển thị khi gọi phương thức SaveChanges(). Điều này xảy ra khi tôi cố cập nhật một thực thể có thuộc tính sưu tập. Thuộc tính vô hướng của thực thể được duy trì mà không có vấn đề nhưng thay đổi về bộ sưu tập không được phản ánh vào cơ sở dữ liệu, như thể nếu nó không thể theo dõi những thay đổi này khi kết nối lại.

Đây là mã mẫu của trường hợp của tôi, nơi tôi thay đổi tên đối tượng và sau đó thêm một đối tượng vào bộ sưu tập báo cáo của nó. Sau SaveChanges(), chỉ tên khách hàng mới được phản ánh trên cơ sở dữ liệu.

this.Client.Name = "Test Client"; 
this.Client.Reports.Add(new Report { Name = "Test Report" }); 

using (ReportCompositionEntities entities = new ReportCompositionEntities(this.connectionStringName)) 
{ 
    entities.Clients.ApplyCurrentValues(this.Client); 
    entities.SaveChanges(); 
} 

Vì vậy, tôi đang làm điều gì sai hoặc EF đơn giản là không thể theo dõi loại thay đổi này khi kết hợp lại một thực thể?

Trả lời

8

Đó là exactly what happens. Không có thay đổi theo dõi và EF không biết về những thay đổi được thực hiện trong thuộc tính điều hướng. Ngoài ra ApplyCurrentValues chỉ có thể xử lý các thuộc tính vô hướng và phức tạp. Không phải thuộc tính điều hướng.

Khi sửa đổi quan hệ trong các tình huống tách rời, bạn phải tự cho EF biết mối quan hệ nào được sửa đổi khi bạn đính kèm thực thể. Bạn có thể tạo một số logic tùy chỉnh cung cấp các thông tin này và sử dụng ObjectStateManager để định cấu hình trạng thái của tất cả các mối quan hệ hoặc bạn có thể tải phiên bản hiện tại bằng các quan hệ từ cơ sở dữ liệu và đồng bộ hóa các thay đổi từ phiên bản đã tách ra thành phiên bản đính kèm được tải theo cách thủ công.

Btw. Tôi không bao giờ sử dụng MVVM vì vậy tôi không chắc nó được áp dụng như thế nào trong trường hợp này nhưng trong trường hợp MVP bạn có thể sử dụng ngữ cảnh sống lâu nếu nó được sử dụng cho một thao tác đơn lẻ - ví dụ như chế độ xem chỉnh sửa sẽ được xử lý bởi người trình bày riêng của nó. . Ngữ cảnh này sẽ tồn tại miễn là chế độ xem sẽ được sử dụng để chỉnh sửa thực thể/tổng hợp = nó sẽ được sử dụng để tải thực thể và bối cảnh tương tự sẽ được sử dụng để lưu thực thể vì trong trường hợp này bản chỉnh sửa được thực hiện bởi cùng một bối cảnh thực thi và thuộc về đơn vị công việc.

+0

Trường hợp thực sự thú vị. Bây giờ thực tế EF không cập nhật những thay đổi này có ý nghĩa vì thực thể thuộc tính điều hướng cũng có thể được tham chiếu bởi một thực thể khác. Không có vấn đề khi một thực thể mới được tạo ra nhưng các vấn đề đồng thời có thể xảy ra với việc xóa. Trong kiến ​​trúc của tôi, mỗi MVVM là một sự hỗ trợ duy nhất của mô hình CRUD. Tôi đã chuyển VM của mình sang chế độ kết nối (quá trình xử lý được xử lý ra khỏi hộp bởi kiến ​​trúc của tôi) và cấu hình bộ nhớ không tiết lộ bất kỳ vấn đề nào ngay bây giờ. Thời gian sẽ nói và nó thực sự khá dễ dàng để quay trở lại chế độ ngắt kết nối. Cảm ơn bạn đã giúp đỡ. – Ucodia

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