Silverlight 从子窗口添加实体导致无法附加实体错误…为什么?
我有一个Silverlight的订单详细信息表单,它有一个订单付款列表框。订单付款绑定到其自己的域数据源,而不是周围订单。我有一个按钮,弹出一个ChildWindow控件来添加新订单付款。订单付款具有与其关联的金额和付款方式 表单加载良好,在下拉列表中显示数据表单中的所有付款方式以及金额的文本框。当我保存订单付款并尝试将其附加回订单详细信息订单付款数据源时,会出现可怕的“无法附加实体,因为它已附加到另一个实体”错误 以下是添加订单付款子窗口的XAML:Silverlight 从子窗口添加实体导致无法附加实体错误…为什么?,silverlight,wcf-ria-services,2-way-object-databinding,Silverlight,Wcf Ria Services,2 Way Object Databinding,我有一个Silverlight的订单详细信息表单,它有一个订单付款列表框。订单付款绑定到其自己的域数据源,而不是周围订单。我有一个按钮,弹出一个ChildWindow控件来添加新订单付款。订单付款具有与其关联的金额和付款方式 表单加载良好,在下拉列表中显示数据表单中的所有付款方式以及金额的文本框。当我保存订单付款并尝试将其附加回订单详细信息订单付款数据源时,会出现可怕的“无法附加实体,因为它已附加到另一个实体”错误 以下是添加订单付款子窗口的XAML: <controls:ChildWin
<controls:ChildWindow.Resources>
<riaControls:DomainDataSource x:Key="paymentMethodsSource" QueryName="GetPaymentMethods" AutoLoad="True">
<riaControls:DomainDataSource.DomainContext>
<ds:CPSDomainContext />
</riaControls:DomainDataSource.DomainContext>
</riaControls:DomainDataSource>
</controls:ChildWindow.Resources>
<dataForm:DataForm x:Name="addOrderPaymentDataForm" AutoGenerateFields="False" AutoCommit="True" AutoEdit="True" CommandButtonsVisibility="None">
<dataForm:DataForm.EditTemplate>
<DataTemplate>
<StackPanel>
<dataForm:DataField Label="Payment Method">
<ListBox ItemsSource="{Binding Data, Source={StaticResource paymentMethodsSource}}"
DisplayMemberPath="Name"
SelectedItem="{Binding PaymentMethod, Mode=TwoWay}"
SelectionMode="Single"/>
</dataForm:DataField>
<dataForm:DataField Label="Amount">
<TextBox Text="{Binding Amount, Mode=TwoWay}" />
</dataForm:DataField>
</StackPanel>
</DataTemplate>
</dataForm:DataForm.EditTemplate>
</dataForm:DataForm>
最后,以下是尝试将新订单付款重新附加到订单详细信息屏幕的代码:
void add_Closed(object sender, EventArgs e) {
AddOrderPaymentWindow pay = (AddOrderPaymentWindow)sender;
if (pay.NewOrderPayment != null) {
Administration.Web.Services.CPSDomainContext context = (CPSDomainContext)orderPaymentDataGridSource.DomainContext;
context.OrderPayments.Add(pay.NewOrderPayment);
context.SubmitChanges();
}
}
我遇到这个问题是因为订单付款有一个绑定到不同数据上下文的属性吗?考虑到子对象必须从RIA服务加载对象才能保存,我甚至可以这样添加子对象吗?我是否应该以某种方式将domaindatasource从order details页面传递给子控件以获得一个数据源?或者我必须恢复到在代码中进行克隆以获取新对象吗?我建议您将DomainContext从父窗口(您在add_Closed中使用的窗口)传递到子窗口,然后在DomainDataSource(paymentMethodsSource)中使用该DomainContext。这样,所有实体都将加载到同一上下文中。另一种方法是在父窗口中执行查询(GetPaymentMethods),将上下文传递给子窗口,然后仅将ListBox.ItemsSource绑定到子窗口中的CPSDomainContext.PaymentMethods
void add_Closed(object sender, EventArgs e) {
AddOrderPaymentWindow pay = (AddOrderPaymentWindow)sender;
if (pay.NewOrderPayment != null) {
Administration.Web.Services.CPSDomainContext context = (CPSDomainContext)orderPaymentDataGridSource.DomainContext;
context.OrderPayments.Add(pay.NewOrderPayment);
context.SubmitChanges();
}
}