使用EntityFramework更新WPF ObservableCollection中的master-detail项

时间:2011-01-07 18:15:19

标签: wpf entity-framework observablecollection

抱歉这个愚蠢的问题,但这是我第一次使用WPF和实体框架。

让我们解释一下我的情景......

我的EF上下文中有一个主类(Customers)和一个详细类(Orders)。 我使用LINQ-to-EF查询(包括Orders)加载我的主类,并将IEnumerable结果集放在ObservableCollection中,该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 :(得分:0)

部分问题可能是手动设置订单上的关联(外键)属性。将对象添加到EF中的父对象时,您实际上只需执行以下操作:

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

通过这种方式,您可以创建对象,将其添加到您想要的本地集合中(在幕后EF跟踪它的创建并记住为其提供密钥和关联密钥)并将其添加到上下文中总体订单收集。

确保在完成该操作后调用保存更改,它将创建FK值并将其全部保存到数据库中。

另外,值得注意的是:如果你有更复杂的对象层次结构,只有这两个类(很可能),如果你不想真正愚蠢的包含语句,你可能会调查LazyLoading。码。这将仅在实际请求时检索所需数据,并使您的LINQ语句更加简洁。