Добавление сущности из дочернего окна приводит к тому, что сущность не может быть прикреплена ошибка .... почему? - PullRequest
0 голосов
/ 16 сентября 2010

У меня есть форма сведений о заказе в Silverlight, в которой есть список платежей по заказам.Платежи заказа связаны с их собственным источником данных домена за пределами окружающего заказа.У меня есть кнопка, которая открывает элемент управления ChildWindow, чтобы добавить новые платежи заказа.Оплата заказа имеет сумму и способ оплаты, связанный с ней.

Форма загружается нормально, отображает все способы оплаты в форме данных в раскрывающемся списке вместе с текстовым полем для суммы.Когда я сохраняю оплату заказа и пытаюсь прикрепить его обратно к источнику данных «Заказы на оплату заказа», я получаю страшное «Объект не может быть присоединен, поскольку он уже связан с ошибкой другого объекта».

Вот XAML для дочернего окна Add Order Payment:

<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>

Вот код для экрана Add Order Payment:

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 для его сохранения?Должен ли я как-то передать источник данных domaindatasource со страницы сведений о заказе дочернему элементу управления, чтобы иметь один источник данных?Или я должен вернуться к выполнению клона в коде, чтобы получить новый объект?

1 Ответ

1 голос
/ 17 сентября 2010

Я бы рекомендовал вам передать DomainContext из родительского окна (которое вы используете в add_Closed) в дочернее окно, а затем использовать этот DomainContext в вашем DomainDataSource (paymentMethodsSource).Таким образом, все объекты загружаются в один и тот же контекст.Альтернативный подход состоит в том, чтобы выполнить запрос (GetPaymentMethods) в родительском окне, передать контекст дочернему окну и просто привязать ListBox.ItemsSource к CPSDomainContext.PaymentMethods в вашем дочернем окне.

...