2011-11-20 11 views
11

Tengo un inicializador/actualizador para un objeto de entidad. ¿Hay algún peligro en el usoCrear <Object> vs nuevo <Object> en Entity Framework

Dim myObject As SpecialThing = New SpecialThing() 

Luego de ajustar todos los valores (utilizando el programa de actualización que ya está escrito), o tengo que utilizar:

Dim myObject As SpecialThing = SpecialThing.Create() 

hay 30 parámetros y del actualizador ya establece los valores/maneja los errores. Solo estoy buscando reutilizar ese código.

Respuesta

3

Si crea el objeto usted mismo, no se adjuntará al contexto. Necesitarás attach the object para tener cambios de actualización en la base de datos.

Eventhough si crea Entity utilizando Create Method, no se adjuntará al contexto y esto se guardará en DB mediante el método SaveChanges. http://msdn.microsoft.com/en-us/library/gg696136(v=vs.113).aspx

+4

Pero lo mismo es cierto para 'myDB.CreateSpecialThing (.....)', al menos para las interpretaciones que pude encontrar para este método. – Slauma

34

No sé exactamente qué quiere decir con myDB.CreateSpecialThing(.....). Tengo tres interpretaciones:

  • objectContext.CreateObject<SpecialThing>()

  • dbContext.SpecialThings.Create() (EF> = 4,1)

  • SpecialThing.Create(.....) (un método estático de EntityObject entidades derivadas)

El tercer método es solo un helper autogenerado que toma parámetros (para los campos requeridos), establece adecuadamente ata y devuelve el objeto. Es exactamente lo mismo que crear el objeto con new y establecer propiedades después.

Los primeros dos métodos entran en juego si está trabajando con POCO y utiliza carga lenta o proxies de seguimiento de cambios. Estos métodos crearán un proxy dinámico de la entidad (que es una clase dinámica derivada de su clase de entidad) y no directamente de la entidad. Ninguno de estos métodos conecta la entidad al contexto, debe hacerlo manualmente, sin importar si usa estos métodos para crear la entidad o crearla con new.

Ejemplo donde el uso de CreateObject<T>/Create puede ser importante, suponiendo una entidad User con un virtualRoles colección:

using (var ctx = new MyDbContext()) 
{ 
    var user = ctx.Users.Create(); 
    user.Id = 1; 
    ctx.Users.Attach(user); 

    var roles = user.Roles; 
} 

Usando virtual permite la carga diferida para la recogida Roles y el código anterior se carga todos los roles de usuario 1 (o una colección vacía si el usuario no tiene roles). Usando new por el contrario ...

using (var ctx = new MyDbContext()) 
{ 
    var user = new User { Id = 1 }; 
    ctx.Users.Attach(user); 

    var roles = user.Roles; 
} 

... no permite cargar con pereza la colección porque user no es un objeto proxy dinámico. roles sería null, sin importar si el usuario tiene roles o no.

Por lo tanto, yo diría que no hay peligro de crear una entidad con new.Solo debe tener en cuenta que no tiene las funciones de carga lenta o proxies de seguimiento de cambios para una entidad creada con new.

+0

Usted tenía razón, me refería a la tercera interpretación. Gracias por la respuesta completa también –