Pregunta

¿Cómo debo configurar una propiedad para que cuando use SaveChanges, la relación de muchos a uno se guarde y no obtenga la instrucción: INSERT en conflicto con la restricción FOREIGN KEY ... error.

Bastante simple, tengo un anuncio y un tipo de anuncio donde hay muchos anuncios para un tipo de anuncio. Hay una propiedad en el anuncio:

public class Ad
{
   public Int32 AdTypeId { get; set; }
   public virtual AdType AdType { get; set; }
}

Para cubrir esta relación.

Cuando hago esto:

someAd.AdType = someAdType;

La propiedad está bien establecida, pero el AdTypeId no. Sin embargo, no se preocupe ya que supongo que esto estaría bien para ahorrar.

context.SaveChanges();

El problema es que en este momento está tratando de guardar el valor 0 en la columna AdTypeId (causando un problema de clave externa) en lugar de usar la propiedad AdType asignada al objeto para averiguar qué debe insertar en la columna AdTypeId.

Cosas que sé:

  • En este punto, someAdType es persistido / tiene una identificación.
  • La propiedad AdType está configurada correctamente.
  • El AdTypeId es 0.
  • Hay una relación de clave externa en la base de datos.
  • AdTypeId es una clave principal.
  • He diferido / carga diferida establecida en verdadero

Realmente no he intentado cambiar el AdType ya que está configurado para permitir la carga diferida.

¿Fue útil?

Solución

Ok parece que estoy usando el no proxy (hizo esa palabra ... Yah) " Seguimiento de cambios basado en instantáneas " enfoque, el sistema no tiene una idea real de que haya cambiado.

  

En este ejemplo, el cliente es un puro   Tipo POCO. A diferencia de EntityObject o   Entidades basadas en IPOCO, haciendo cambios   a la entidad no automáticamente   mantener al administrador del estado sincronizado porque   no hay notificación automática   entre sus entidades de POCO puro y   El marco de la entidad. Por lo tanto, sobre   preguntando al administrador del estado, piensa   que el estado del objeto del cliente es   Sin cambios a pesar de que tenemos   hizo un cambio explícito a uno de los   propiedades en la entidad.

Lo tengo desde aquí

Entonces, para asegurarme de que sepa verificar si ha habido un cambio, tengo que usar Opción AcceptAllChangesAfterSave con el método SaveChanges.

context.SaveChanges(System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave);

Y funciona. Espero que lo entienda correctamente ...

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