Обновите элемент основной детали в коллекции WPF ObservableCollection с EntityFramework - PullRequest
1 голос
/ 07 января 2011

извините за глупый вопрос, но это мой первый подход с WPF и Entity Framework.

Давайте объясним мой сценарий ...

У меня есть мастер-класс (Клиенты) и деталикласс (Заказы), оба в моем контексте EF.Я загружаю свой мастер-класс с помощью запроса LINQ-to-EF (включая заказы) и помещаю результирующий набор IEnumerable в ObservableCollection, который используется в качестве источника для ListBox.

Тогда у меня есть DataGrid, куда я загружаю заказы.Теперь, поскольку главные элементы находятся в ObservableCollection, я могу добавлять, удалять и обновлять элемент, и это автоматически отражается в моем ListBox.Проблема в том, когда мне нужно добавить заказ для клиента.

Есть ли способ обновить только элемент в ObservableCollection без повторной загрузки всех элементов из контекста?

Это мой код (упрощенно)

// Loading Customers
EntitiesContext context = new EntitiesContext();
IEnumerable<Customer> customers = from c in context.Customer.Include("Orders")
                                          select c;
ObservableCollection<Customer> oc = new ObservableCollection<Customer>(customers);
// Binding ListBox
listCustomers.ItemsSource = oc;

...

// Retrieving a Customer (1st for instance...)
Customer c = (listCustomers.Items[0] as Customer);
Order o = new Order {Customer = c.ID, Item = "xxx"};
context.AddToOrders(o);

// How can I update the ObservableCollection?

Заранее спасибо,

Мануэль

1 Ответ

0 голосов
/ 08 января 2011

Частично проблема может заключаться в ручной настройке свойства Ассоциации (внешнего ключа) в Заказе.При добавлении объекта к родительскому объекту в EF вы действительно просто делаете что-то вроде следующего:

Order o = new Order {Item="xxx"};
c.Orders.Add(o);
context.AddToOrders(o);

Таким образом, вы создаете объект, добавляете его в коллекцию на локальной стороне, которую вы хотите.(за кулисами EF отслеживает его создание и запоминает, чтобы дать ему ключ и ассоциативный ключ) и добавляет его в коллекцию контекстов по всем заказам.

Обязательно вызовите изменения сохранения, когда вы закончите с этимоперации, и он создаст значение FK и сохранит все это в базе данных.

Также, обратите внимание: если у вас есть более сложные иерархии объектов, чем только два класса, (что вероятно) вы можете посмотреть LazyLoading , если вы не хотите по-настоящему глупо включать в свой код встроенные операторы.Это будет извлекать необходимые данные только тогда, когда они действительно запрашиваются, и сделает ваши операторы LINQ намного более краткими.

...