Tôi đã đọc một số câu hỏi/câu trả lời phải thực hiện với thông báo lỗi cụ thể này, nhưng tôi không hiểu rõ giải pháp thích hợp.Không thể xác định mối quan hệ giữa hai đối tượng vì chúng được gắn với các đối tượng ObjectContext khác nhau
Tôi đã đọc nhiều lần rằng bạn nên tạo ngữ cảnh EF4, sử dụng nó, sau đó vứt bỏ nó. Trong suốt ứng dụng của tôi, tôi đang tải các thực thể ở đây và ở đó bằng cách sử dụng các đối tượng ngữ cảnh khác nhau, và sau đó cuối cùng muốn kết hợp các thực thể lại với nhau.
Tôi đã tạo ứng dụng bảng điều khiển đơn giản dễ gây ra lỗi. Mô hình rất đơn giản được lập sơ đồ theo sau là mã.
Làm cách nào để có hai thực thể khác nhau chia sẻ cùng một ngữ cảnh? Tôi có thực sự phải tạo một bối cảnh mới, tải lại hai thực thể (mặc dù tôi đã có chúng), chỉ cần kết hợp chúng và lưu?
Nếu tôi chỉ đơn giản là bỏ lỡ câu hỏi/câu trả lời thích hợp đã tồn tại, vui lòng chỉ cho tôi đúng địa điểm.
internal class Program {
private static void Main(string[] args) {
DeleteAllEntities();
CreateInitialEntities();
Owner o = LoadOwner();
Child c = LoadChild();
AssociateAndSave(o, c);
}
private static void AssociateAndSave(Owner o, Child c) {
using (var context = new ModelEntities()) {
// Exception occurs on the following line.
o.Children.Add(c);
context.Attach(o);
context.SaveChanges();
}
}
private static Owner LoadOwner() {
using (var context = new ModelEntities()) {
return ((from o in context.Owners
select o).First());
}
}
private static Child LoadChild() {
using (var context = new ModelEntities()) {
return ((from c in context.Children
select c).First());
}
}
private static void CreateInitialEntities() {
using (var context = new ModelEntities()) {
Owner owner = new Owner();
Child child = new Child();
context.Owners.AddObject(owner);
context.Children.AddObject(child);
context.SaveChanges();
}
}
private static void DeleteAllEntities() {
using (var context = new ModelEntities()) {
List<Child> children = (from c in context.Children
select c).ToList();
foreach (var c in children)
context.Children.DeleteObject(c);
List<Owner> owners = (from o in context.Owners
select o).ToList();
foreach (var o in owners)
context.Owners.DeleteObject(o);
context.SaveChanges();
}
}
}
Hmm .. Chỉ cần gọi 'context.Attach (o); context.Attach (c); 'ngăn chặn lỗi. Nhưng khi tôi thử điều này trong ứng dụng thực tế của mình, tôi nhận được 'Một đối tượng có cùng khóa đã tồn tại trong ObjectStateManager. ObjectStateManager không thể theo dõi nhiều đối tượng với cùng một khóa' mặc dù các thực thể được nạp theo cách tương tự với ví dụ này ... – Steve