2011-09-05 12 views
49

Estoy un poco confundido acerca de si usar DbSet.Create, o simplemente actualizar una entidad y agregarla. Realmente no entiendo las ramificaciones de usar DbSet.Create.Ramificaciones de DbSet.Crear frente a una nueva Entidad()

Entiendo que DbSet.Create creará una versión proxiada si corresponde, pero realmente no entiendo lo que eso significa. ¿Porqué me importa? Me parece que una clase Proxied vacía no es más útil que una clase no proxy, ya que no hay entidades relacionadas con la carga lenta.

¿Puede decirme la diferencia, más allá de lo obvio? ¿Y por qué te importaría?

Respuesta

51

Un escenario donde usar DbSet<T>.Create() tiene sentido es asociar una entidad existente al contexto y luego aprovechar la carga diferida de las entidades relacionadas. Ejemplo:

public class Parent 
{ 
    public int Id { get; set; } 
    public virtual ICollection<Child> Children { get; set; } 
} 

public class Child 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

El siguiente funcionaría entonces: se desencadena

using (var context = new MyDbContext()) 
{ 
    var parent = context.Parents.Create(); 
    parent.Id = 1; // assuming it exists in the DB 
    context.Parents.Attach(parent); 

    foreach (var child in parent.Children) 
    { 
     var name = child.Name; 
     // ... 
    } 
} 

carga Aquí perezoso de los niños (quizás con la consiguiente colección vacía, pero no null). Si reemplaza context.Parents.Create() por new Parent(), el bucle foreach se bloqueará porque parent.Children siempre es null.

Editar

Otro ejemplo fue aquí (poblar una propiedad clave externa de una nueva entidad y luego conseguir la propiedad de navegación cargados de forma liviana después de la nueva entidad se inserta en el DB): Lazy loading properties after an insert

+3

Ahh. No me di cuenta de que solo podías rellenar una identificación de clave externa y cargarla de forma perezosa sin todo el alboroto. Supongo que puedo ver cómo podría ser útil si no quiere cargar el registro existente y solo desea el hijo. –

+0

Qué hacer si "context.Parents" es nulo, estoy probando su caso y parece que funciona, pero desafortunadamente para mí "context.Parents" es nulo, por lo que aquí se genera una excepción como Excepción de tipo 'System.NullReferenceException 'ocurrió en YourProject.dll pero no se manejó en el código de usuario Información adicional: Referencia de objeto no configurada para una instancia de un objeto. Si tiene alguna solución, por favor avíseme, así que la superaré y escribiré en mis notas para escapar de las próximas incidencias. –

Cuestiones relacionadas