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

StackOverflow https://stackoverflow.com/questions/3728673

Вопрос

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

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

Вот XAML для окна Add Заказать Окно платежа.

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

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

Это было полезно?

Решение

Я бы порекомендовал вы передавать доменContext из родительского окна (тот, который вы используете в ADD_CLEED) к дочерному окну, а затем используете этот доменContext в вашем domaindataSource (paymentmethodssource). Таким образом, все объекты загружаются в один и тот же контекст. Альтернативный подход заключается в том, чтобы сделать запрос (GetPaymentMethods) в родительском окне, передайте контекст к дочерному окну и просто связывайте Listbox.ItemsSource для CPSdomainContext.paymentMethods в вашем дочернем окне.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top