Entity Framework 4, các đối tượng POCO và ASP.Net MVC2. Tôi có nhiều mối quan hệ, hãy nói giữa các thực thể BlogPost và Tag. Điều này có nghĩa là trong lớp POCO BlogPost được tạo T4 của tôi, tôi có:
public virtual ICollection<Tag> Tags {
// getter and setter with the magic FixupCollection
}
private ICollection<Tag> _tags;
Tôi yêu cầu một BlogPost và các Thẻ liên quan từ một phiên bản của ObjectContext và gửi nó đến một lớp khác (Xem trong ứng dụng MVC). Sau đó, tôi lấy lại BlogPost đã cập nhật với các thuộc tính đã thay đổi và các mối quan hệ đã thay đổi. Ví dụ: nó có thẻ "A" "B" và "C", và các thẻ mới là "C" và "D". Trong ví dụ cụ thể của tôi không có Thẻ mới và các thuộc tính của Thẻ không bao giờ thay đổi, vì vậy điều duy nhất nên được lưu là các mối quan hệ đã thay đổi. Bây giờ tôi cần lưu nó trong một ObjectContext khác. (Cập nhật: Bây giờ tôi đã cố gắng thực hiện trong cùng một trường hợp ngữ cảnh và cũng không thành công.)
Vấn đề: Tôi không thể làm cho nó cứu vãn các mối quan hệ đúng cách. Tôi đã thử mọi thứ tôi tìm thấy:
- Controller.UpdateModel và Controller.TryUpdateModel không hoạt động.
- Lấy BlogPost cũ từ ngữ cảnh sau đó sửa đổi bộ sưu tập không hoạt động. (với các phương pháp khác nhau từ điểm tiếp theo)
- Điều này có thể sẽ hiệu quả, nhưng tôi hy vọng đây chỉ là một giải pháp thay thế, không phải là giải pháp :(.
- Đã thử các chức năng Đính kèm / Thêm / ChangeObjectState cho BlogPost và / hoặc Thẻ trong mọi kết hợp có thể. Thất bại.
- Điều này trông giống như những gì tôi cần, nhưng nó không hoạt động (Tôi đã cố gắng khắc phục nó, nhưng không thể cho sự cố của tôi).
- Đã thử ChangeState / Add / Attach / ... các đối tượng quan hệ của ngữ cảnh. Thất bại.
"Không hoạt động" có nghĩa là trong hầu hết các trường hợp, tôi đã làm việc trên "giải pháp" đã cho cho đến khi nó không tạo ra lỗi và lưu ít nhất các thuộc tính của BlogPost. Điều gì xảy ra với các mối quan hệ sẽ khác nhau: thông thường Thẻ được thêm lại vào bảng Thẻ với PK mới và BlogPost đã lưu tham chiếu những thẻ đó chứ không phải những thẻ ban đầu. Tất nhiên các Thẻ trả về có PK và trước khi lưu / cập nhật phương pháp tôi kiểm tra PK và chúng bằng với các PK trong cơ sở dữ liệu nên có thể EF nghĩ rằng chúng là đối tượng mới và PK đó là đối tượng tạm thời.
Một vấn đề mà tôi biết và có thể khiến không thể tìm ra giải pháp đơn giản tự động: Khi bộ sưu tập của đối tượng POCO bị thay đổi, điều đó sẽ xảy ra bởi thuộc tính bộ sưu tập ảo đã đề cập ở trên, vì khi đó thủ thuật FixupCollection sẽ cập nhật các tham chiếu ngược ở đầu bên kia của mối quan hệ nhiều-nhiều. Tuy nhiên, khi Chế độ xem "trả về" đối tượng BlogPost đã cập nhật, điều đó đã không xảy ra. Điều này có nghĩa là có thể không có giải pháp đơn giản nào cho vấn đề của tôi, nhưng điều đó sẽ khiến tôi rất buồn và tôi sẽ ghét chiến thắng EF4-POCO-MVC :(. Điều đó cũng có nghĩa là EF không thể làm điều này trong môi trường MVC, bất kỳ điều gì Các loại đối tượng EF4 được sử dụng :(. Tôi nghĩ rằng theo dõi thay đổi dựa trên ảnh chụp nhanh sẽ phát hiện ra rằng BlogPost đã thay đổi có mối quan hệ với Thẻ với PK hiện có.
Btw: Tôi nghĩ vấn đề tương tự cũng xảy ra với quan hệ một-nhiều (google và đồng nghiệp của tôi nói vậy). Tôi sẽ thử nó ở nhà, nhưng ngay cả khi điều đó không hiệu quả với tôi trong sáu mối quan hệ nhiều-nhiều trong ứng dụng của tôi :(.