让我们解释一下我的情景......
我的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?
提前致谢,
曼努埃尔
答案 0 :(得分:0)
部分问题可能是手动设置订单上的关联(外键)属性。将对象添加到EF中的父对象时,您实际上只需执行以下操作:
Order o = new Order {Item="xxx"};
c.Orders.Add(o);
context.AddToOrders(o);
通过这种方式,您可以创建对象,将其添加到您想要的本地集合中(在幕后EF跟踪它的创建并记住为其提供密钥和关联密钥)并将其添加到上下文中总体订单收集。
确保在完成该操作后调用保存更改,它将创建FK值并将其全部保存到数据库中。
另外,值得注意的是:如果你有更复杂的对象层次结构,只有这两个类(很可能),如果你不想真正愚蠢的包含语句,你可能会调查LazyLoading。码。这将仅在实际请求时检索所需数据,并使您的LINQ语句更加简洁。