Pregunta

Esta tiene que ser una pregunta frecuente, pero no en SO todavía, por lo que parece. Estoy usando Linq to SQL para una aplicación que permite una variedad de cambios de datos en mi modelo en memoria, y los cambios se colocarán en una cola para un procesamiento asíncrono. Por lo tanto, no estoy preocupado por las actualizaciones (todavía). Los cambios en varias partes de los datos se pueden realizar a través de ventanas emergentes modales en la página web. Algunos están basados ??en cuadrícula, otros son solo atributos. Estoy encontrando un problema con los cambios que no sobreviven a los ciclos de devolución de datos. Obviamente, no quiero guardar nada en la base de datos hasta que se realicen todos los cambios y el usuario envíe la página.

La ruta que he elegido hasta ahora es:

  • Deshabilité la carga diferida
  • Creo una clase parcial [serializable] para mi objeto raíz
  • Pongo el objeto en la sesión y lo recupero en el evento onload

Esto parece funcionar en principio. Sin embargo, cuando intento actualizar algunas de las propiedades de los niños después de recuperar el objeto de la sesión

p.PhysicianSpecialties[0].physician_specialty_code = 
    ddlSpecialty.SelectedItem.Value;

Recibo este error:

Operation is not valid due to the current state of the object.

El error se debe a esta llamada de método en el método de establecimiento de Linq generado:

this.SendPropertyChanging();

Otras propiedades se actualizan muy bien:

p.PhysicianNames[0].first_name = txtFirstName.Text.ToUpper();

Esto no causa un error.

Mis preguntas: ¿Estoy fundamentalmente en el camino equivocado? ¿Hay una mejor manera de hacer esto? ¿Qué causa el error?

Actualización: La excepción es 'System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException'. Creo que I am on to algo , pero todavía no conozco la solución.

¿Fue útil?

Solución

Obtuve la solución de MSDN. El problema es, y se explica mejor en este hilo de lo que puedo hacer, que no se puede cambiar una asociación unilateralmente, sino que se debe hacer en ambos extremos, asignando un nuevo objeto secundario, no solo cambiando el id:

p.PhysicianSpecialties [0] .PhysicianSpecialtyLookup =     db.PhysicianSpecialtyLookups.Single (c = >     (c.physician_specialty_code == ddlSpecialty.SelectedItem.Value));

Otros consejos

¿Y cómo se puede hacer eso si se usa el enlace de datos? Tengo una lista desplegable en una vista de cuadrícula de datos que comenzó a lanzar este error cuando cambio el valor desplegable. Esto me hace pensar que debo eliminar la asociación o no usar el enlace de datos.

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