2013-06-27 3 views
5

Я искал какое-то время, и ничего не могу найти. У меня есть ситуация, когда у меня есть два объекта (см. Определение ниже). Детский объект представляет собой коллекцию родительского элемента. Я работаю в Visual Studio 2012 с WPF/Prism и Entity Framework 4,4Entity Framework 4.4, перезагрузка Объекты коллекции ребенка

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 } 
} 

У меня есть форма, которая имеет родительской загрузки в окне списка на левой стороне и пользователь нажимает на один из элементов в список, и мы покажем свойства в правой части. Все отлично работает. У нас есть две машины, попавшие в одну и ту же базу данных. если одна машина добавляет или обновляет одну из записей, у меня возникают проблемы со второй машиной, получающей данные ...

У меня есть следующий код, чтобы исправить это, но кажется, что должен быть простой способ в рамках сущности.

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 

Любые мысли о том, что я могу сделать лучше или это способ сделать это ?????

+0

+1, потому что я считаю это хорошим решением (и я узнал, что 'Reload' удаляет удаленные объекты из дочерней коллекции). Я сомневаюсь, что вы можете сжать это в простой однострочный вкладыш или около того. Обновление/обновление графиков объектов редко с EF. – Slauma

+0

Одна из проблем, которые у меня есть с моим решением, заключается в том, что в моем фактическом коде у меня есть 4-5 таких типов коллекций. Кажется, что первая перезагрузка должна также перезагрузить все дочерние коллекции или, по крайней мере, ntry.Collection (o => o.Children) .Load(); следует, возможно, есть «Reload» вместо – adondero

+1

нашел лучший способ сделать Еогеасп выше на массиве '((IObjectContextAdapter) DbContext) .ObjectContext.Refresh (RefreshMode.StoreWins, parent.Children);' это удаляет записи и обновляет текущие. по-прежнему требуется .Load() для получения новых записей. Это также, кажется, намного быстрее. – adondero

ответ

12

Перемещенные это ответ

нашел лучший способ сделать «Еогеасп» выше на массиве

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

это удаляет записи и обновляет текущие. по-прежнему требуется .Load() для получения новых записей. Это также кажется намного быстрее также