2013-06-27 34 views
5

Tôi đã tìm kiếm một lúc và không có gì tôi có thể tìm được tác phẩm. Tôi có một tình huống mà tôi có hai đối tượng (xem định nghĩa bên dưới). Đối tượng con là một bộ sưu tập trên bố mẹ. Tôi đang làm việc trong Visual Studio 2012 với WPF/Prism và Entity Framework 4,4Entity Framework 4.4, tải lại các đối tượng Bộ sưu tập trẻ em

class Parent 
{ 
    ...other properties... 
    public virtual ICollection<Child> Children { get; set; } 
} 

class Child 
{ 
    public string Value1 { get; set } 
    public string Value2 { get; set } 
    public string Value3 { get; set } 
} 

Tôi có một Form có tải chuyên vào một hộp danh sách ở phía bên tay trái và người dùng nhấp vào một trong các mục trong danh sách và chúng tôi hiển thị các thuộc tính ở phía bên tay phải. Tất cả mọi thứ hoạt động tuyệt vời UNTIL chúng tôi có hai máy đánh cùng một cơ sở dữ liệu. nếu một máy thêm hoặc cập nhật một trong các bản ghi, tôi đang gặp sự cố với máy thứ hai nhận dữ liệu ...

Tôi có mã sau để thử và sửa nó, nhưng có vẻ như cần phải có một cách dễ dàng trong khuôn khổ thực thể.

DbEntityEntry<Parent> entry = dbContext.Entry(parent); 
entry.Reload(); //Note: this refreshes the properties on the Parent object (but not the collection 

if (Parent.Children != null) 
{ 
    Array a = doc.Children.ToArray<Child>(); //this is here because they may have deleted one of the records 

    foreach (Child g in a) 
    { 
     DbEntityEntry<Child> c= dbContext.Entry(g); 
     c.Reload(); //Note: if it is deleted, the Parent.Child gets updated automatically to remove the record. 
    } 
} 

entry.Collection(o => o.Children).Load(); //call this to get new records 

Bất kỳ suy nghĩ nào về những gì tôi có thể làm tốt hơn hoặc đây là cách để làm điều đó ?????

+0

+1 vì tôi tìm thấy giải pháp tốt (và tôi biết rằng 'Tải lại 'sẽ xóa các thực thể đã xóa khỏi bộ sưu tập con). Tôi nghi ngờ rằng bạn có thể nén nó thành một lớp lót đơn giản. Cập nhật/làm mới đồ thị đối tượng hiếm khi dễ dàng với EF. – Slauma

+0

Một trong những vấn đề tôi có với giải pháp của mình là trong mã thực tế của tôi, tôi có 4-5 trong số các loại bộ sưu tập này. Có vẻ như tải lại đầu tiên nên tải lại tất cả các bộ sưu tập con cũng, hoặc ít nhất là ntry.Collection (o => o.Children) .Load(); nên có thể có một "Reload" thay vì – adondero

+1

tìm thấy một cách tốt hơn để làm foreach trên trên mảng '((IObjectContextAdapter) dbContext) .ObjectContext.Refresh (RefreshMode.StoreWins, parent.Children);' điều này loại bỏ mục và cập nhật những cái hiện tại. vẫn cần .Load() để có được các bản ghi mới. Điều này cũng có vẻ nhanh hơn rất nhiều. – adondero

Trả lời

12

Moved này để một câu trả lời

tìm thấy một cách tốt hơn để làm "foreach" ở trên vào mảng

((IObjectContextAdapter)dbContext).ObjectContext.Refresh(RefreshMode.StoreWins, parent.Children); 

này loại bỏ các mục và cập nhật những cái hiện tại. vẫn cần .Load() để có được các bản ghi mới. Điều này cũng có vẻ nhanh hơn rất nhiều cũng

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