添加来自儿童窗口原因的实体无法附加错误……为什么?
-
03-10-2019 - |
题
我在Silverlight中有一个订单详细信息表,其中包含订单付款的列表框。订单付款与周围订单之外的自己的域数据源约束。我有一个按钮可以弹出一个Childwindow控件,以增加新的订单付款。订单付款具有与之相关的金额和付款方式。
该表单可以正加载,将所有付款方式显示在下拉列表中的所有付款方式以及金额的文本框。当我保存订单付款并尝试将其附加到订单详细信息订单付款数据源时,我无法附加可怕的“实体”,因为它已经连接到另一个实体的错误。
这是添加订单付款子窗口的XAML:
<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>
这是添加订单付款屏幕背后的代码:
public AddOrderPaymentWindow() {
InitializeComponent();
NewOrderPayment = new OrderPayment();
addOrderPaymentDataForm.CurrentItem = NewOrderPayment;
addOrderPaymentDataForm.BeginEdit();
}
public OrderPayment NewOrderPayment { get; set; }
private void OKButton_Click(object sender, RoutedEventArgs e) {
NewOrderPayment.CreatedBy = "jkandiko";
NewOrderPayment.CreatedOn = DateTime.Now;
NewOrderPayment.ModifiedBy = "jkandiko";
NewOrderPayment.ModifiedOn = DateTime.Now;
var result = addOrderPaymentDataForm.CommitEdit();
this.DialogResult = true;
}
private void CancelButton_Click(object sender, RoutedEventArgs e) {
NewOrderPayment = null;
addOrderPaymentDataForm.CancelEdit();
this.DialogResult = false;
}
最后,这是试图将新订单付款重新汇总到订单详细信息屏幕的代码:
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服务加载对象才能保存它?我是否应该以某种方式将域DataSource从订单详细信息页面传递给子女控制以拥有一个数据源?还是我必须恢复到代码中的克隆以获取新对象?
解决方案
我建议您从父窗口(您在add_clated中使用的窗口)传递域context到子窗口,然后在您的domaindatasource(paymentmethodssource)中使用该域context。这样,所有实体都被加载到相同的上下文中。另一种方法是在父窗口中执行查询(getPaymentMethods),将上下文传递到子窗口,只需将listbox.itemssource绑定到cpsdomainContext.paymentmethods。
不隶属于 StackOverflow