6

Tengo algunos registros principales ya insertados en la base de datos. Ahora quiero agregar algunos registros secundarios. Para ello he seguido siguientes pasos:Insertar registro en la tabla secundaria cuando el registro principal ya existe utilizando el código de Entity Framework primero

  1. recuperar los Padres (A) registra
  2. crear un nuevo registro hijo (B)
  3. Añadir registro padre a la propiedad de navegación del Niño. B.A = A
  4. Llamar SaveChanges.

El problema es cuando hago esto. EF inserta una nueva matriz y luego agrega el elemento secundario con una clave externa que apunta al nuevo elemento primario recién insertado en lugar de insertar solo el elemento secundario con la asignación al elemento primario existente. También verifiqué la clave primaria de los padres al guardar al niño y existe en la base de datos.

Tenga en cuenta que estoy utilizando la identidad generada en la base de datos para padres y secundarios. Una cosa que noté fue si agregué/Save Parent y Child del mismo objeto de contexto, entonces funciona bien.

Necesitan solucionarlo lo antes posible. Cualquier ayuda será apreciada.

Respuesta

18

Sí, debe usar el mismo contexto para esa operación. Ese es el punto. Si no usa el mismo contexto, debe controlar manualmente qué objeto se insertará, cuál se actualizó y cuál no se modificará. En el escenario de la secuencia puede ser:

context.Parents.Attach(parent); // just attach as unchanged 
context.Childs.Add(child); // add as inserted 
parent.Childs.Add(child); // make connection between existing and inserted object 
context.SaveChanges(); 

Otro enfoque puede ser:

child.Parent = parent; 
context.Childs.Add(child); // both child and parent are marked as inserted!!! 
context.Entry(parent).State = EntityState.Unchanged; // set parent as unchanged 
context.SaveChanges(); 
+1

El segundo enfoque funcionó para mí. Muchas gracias. – Amit

+0

Tiene el mismo problema. ¿Puedes echar un vistazo a: http://stackoverflow.com/questions/16131090/the-relationship-could-not-be-changed-the-foreign-key-properties-is-non-nulla/16131494?noredirect= 1 # comment23046042_16131494? Obtengo 'MamConfiguration_V1' en el contexto exacto en el que guardo los cambios. Está unido al mismo contexto. El flujo: obtener MamConfiguration_V1 con Id que obtuve en la interfaz de usuario (modo de edición) -> asignarle todos los valores desde la interfaz de usuario -> anular \ agregar \ eliminar miembros de referencia (navegación) 'MamConfigurationToBrowser_V1'. ¿Eso agregó información? –

+0

+1 Todos los días aprendo algo nuevo y esta es de lejos la mejor explicación para este problema que he visto. ¡Gracias! –

0

Además, en el caso en que tenga algo como:

public class B 
{ 
[Key] 
public int Id {get;set;} 

public AId {get;set;} 

//... other properties here 

[ForeignKey("AId")] 
public virtual A ParentA {get;set;} 
} 

sólo se podía establecer la clave externa a la entrada A de ID existente en DB sin y deje el ParentA nulo y en context.SaveChanges() funcionará como se esperaba (sin crear otro A) entrada en DB).

Cuestiones relacionadas