Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用EntityFramework更新WPF ObservableCollection中的主详细信息项_Wpf_Entity Framework_Observablecollection - Fatal编程技术网

使用EntityFramework更新WPF ObservableCollection中的主详细信息项

使用EntityFramework更新WPF ObservableCollection中的主详细信息项,wpf,entity-framework,observablecollection,Wpf,Entity Framework,Observablecollection,很抱歉提出这个愚蠢的问题,但这是我使用WPF和实体框架的第一种方法 让我们解释一下我的情况 在EF上下文中,我有一个主类(Customers)和一个详细类(Orders)。 我使用LINQ to EF查询(包括Orders)加载主类,并将IEnumerable结果集放入ObservableCollection中,该集合用作列表框的源 然后我有一个数据网格,在那里我加载订单。 现在,由于主项位于ObservableCollection中,我可以添加、删除和更新一个自动反映到我的列表框中的项。 问题

很抱歉提出这个愚蠢的问题,但这是我使用WPF和实体框架的第一种方法

让我们解释一下我的情况

在EF上下文中,我有一个主类(Customers)和一个详细类(Orders)。 我使用LINQ to EF查询(包括Orders)加载主类,并将IEnumerable结果集放入ObservableCollection中,该集合用作列表框的源

然后我有一个数据网格,在那里我加载订单。 现在,由于主项位于ObservableCollection中,我可以添加、删除和更新一个自动反映到我的列表框中的项。 问题是何时需要向客户添加订单

有没有一种方法可以只更新ObservableCollection中的一个项,而不重新加载上下文中的所有项

这是我的代码(简化)

//正在加载客户
EntitiesContext=新的EntitiesContext();
IEnumerable customers=来自context.Customer.Include(“订单”)中的c
选择c;
ObservableCollection oc=新的ObservableCollection(客户);
//绑定列表框
listCustomers.ItemsSource=oc;
...
//检索客户(例如,第一个…)
客户c=(将客户.Items[0]列为客户);
订单o=新订单{Customer=c.ID,Item=“xxx”};
上下文。AddToOrders(o);
//如何更新ObservableCollection?
提前感谢,


Manuel

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

Order o = new Order {Item="xxx"};
c.Orders.Add(o);
context.AddToOrders(o);
通过这种方式,您可以创建对象,将其添加到所需本地侧的集合(幕后EF跟踪其创建并记住为其提供键和关联键),然后将其添加到“所有订单”集合的上下文中

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


另外,需要注意的是:如果您有更复杂的对象层次结构,而仅仅是这两个类(这很可能),那么如果您不想让真正愚蠢的include语句硬连接到您的代码中,您可能会进行研究。这将仅在实际请求时检索所需数据,并将使LINQ语句更加简洁

谢谢你的回答!这样,我只需向我的客户添加一个订单,但我不会刷新我的ObservableCollection。没问题。如果这是一个答案,请向上投票并/或将其标记为答案。与其与列表交互,最好与ObservableCollection交互。尝试执行类似以下操作:oc[0]。Orders.Add(o);。我设想列表是绑定的,但它没有被指定为双向绑定,因此列表中填充了值/对象,但对列表的更改不会被推回到源。通过专门处理源代码,您可以缓解这种情况,并将所有交互集中在一个地方。
Order o = new Order {Item="xxx"};
c.Orders.Add(o);
context.AddToOrders(o);