Agregar entidad de la ventana secundaria hace que la entidad no se puede conectar error ... ¿por qué?

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

Pregunta

Tengo un formulario de detalles de la orden en Silverlight que tiene un cuadro de lista de ordenar los pagos. Los pagos de la orden están obligados a su propia fuente de datos fuera del dominio de la orden de los alrededores. Tengo un botón que aparece un control ChildWindow para añadir nuevas ordenar los pagos. Una orden de pago tiene una cantidad y un método de pago asociado con él.

La multa formulario se carga, muestra todos los métodos de pago en un DataForm en un menú desplegable junto con el cuadro de texto para la cantidad. Cuando guardo la orden de pago y trato de conectar de nuevo a la orden detalles Pagos Solicitar fuente de datos, consigo la temida 'Entidad no se puede conectar porque ya está unido a otra entidad de error.

Aquí está el XAML para la ventana de Pago niño con TDA orden:

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

Este es el código detrás de la pantalla Agregar Orden:

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

Por último, aquí está el código que trata de volver a colocar la nueva orden de pago a la orden Pantalla detalles:

 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();
        }
    }

Estoy corriendo en este problema debido a que la orden de pago una propiedad en él que está unido a un contexto de datos diferente? Puedo incluso añadir un objeto secundario de esta manera, dado que el objeto hijo ha de objetos de carga de los servicios RIA a fin de que se salven? Debería de alguna manera pasar el domaindatasource desde la página de detalles del pedido para el control secundario para tener una fuente de datos? O tengo que volver a hacer un clon de código para obtener un nuevo objeto?

¿Fue útil?

Solución

Yo recomiendo que pase el DomainContext de la ventana padre (el que se utiliza en add_Closed) a la ventana secundaria y luego utiliza ese DomainContext en su DomainDataSource (paymentMethodsSource). De esta manera todas las entidades están siendo cargados en el mismo contexto. Un enfoque alternativo sería hacer la consulta (GetPaymentMethods) en la ventana principal, pase el marco de la ventana secundaria, y simplemente se unen a la ListBox.ItemsSource CPSDomainContext.PaymentMethods en la ventana de su hijo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top