2011-04-12 15 views
19

Tengo el siguiente modelo.Código de EF Primeras inserciones entre padres e hijos con columnas de identidad

class Parent 
{ 
    int ParentId (identity column) { get; set; } 
    string ParentName { get; set; } 
    virtual ICollection<Child> Children { get; set; } 
} 

class Child 
{ 
    int ChildId (identity column) { get; set; } 
    string ChildName { get; set; } 
    int ParentID { get ; set; } //foreign key to Parent(ParentID) 
} 

¿Cómo puedo insertar algunas filas en mi padre e hijo en una sola transacción? Básicamente, quiero obtener la identidad generada en el padre (digamos que inserte una fila en el padre) e insertar filas secundarias con ese valor? ¿Cómo se puede lograr esto con Code First?

Respuesta

37

No debe preocuparse sobre qué valor obtendrá el Id de Parent para insertar Child filas. Esto debe ser lo bastante:

var parent = new Parent 
{ 
    // fill other properties 

    Children = new List<Child>() 
} 

parent.Children.add(new Child { /*fill values */); 

dbContext.Parents.Add(parent); // whatever your context is named 
dbContext.SaveChanges(); 

Para el registro, los ID se le asignará después de llamar SaveChanges(), por lo que si realmente necesita el ID de una entidad antes de insertar Child siempre puede llamar SaveChanges() dos veces.

De nuevo, esto no debería ser necesario sin embargo.

Por cierto, recomendaría haciendo que la propiedad clave externa de Child a Parent una propiedad de navegación, por lo que la clase Child se vería así:

class Child 
{ 
    public int ChildId { get; set; } // identity column 
    public string ChildName { get; set; } 
    public virtual Parent Parent { get ; set; } //foreign key to Parent 
} 

De esa manera siempre se puede acceder a los padres del niño directamente sin tener que recuperarlo explícitamente de la base de datos usted mismo (se cargará de forma diferida).

+0

¿No quisiste decir 'SaveChanges' y' dbContext.Parents.Add (parent) '? –

+0

@Ladislav - Sí y sí, he corregido mi respuesta, gracias. Estaba mirando mi propia implementación de la Unidad de trabajo cuando respondí esto y me distraje/confundí :) –

+1

El marco de la entidad primero inserta el elemento principal y luego los elementos secundarios. 'insert into parent -> newly_created_parent_id' y luego' insert into child (..., parent_id) values ​​(..._ newly_created_parent_id) '. Probé esto y como dijiste que funciona, pero estoy buscando documentación donde establezca este comportamiento. ¿O es esto demasiado lógico para ponerlo en la documentación (msdn)? – broadband

Cuestiones relacionadas