2010-07-18 13 views

Respuesta

33

Ahora que ha leído la respuesta de todos, le daré la respuesta correcta. EF no es compatible con la carga diferida de las propiedades. Sin embargo, apoya un concepto mucho más poderoso que este. Se llama división de tabla donde puede asignar una tabla a dos entidades. Supongamos que una tabla de productos en la base de datos se puede asignar a la entidad del producto y a la entidad ProductDetail. A continuación, puede mover los campos costosos a la entidad ProductDetail y luego crear una asociación 1..1 entre prodcut y la entidad dedetexto de producto. A continuación, puede cargar la asociación de detalles del producto solo cuando lo necesite. En mi capítulo de rendimiento de mi libro, tengo una receta llamada. 13-9. Mover una propiedad costosa a otra entidad

Espero que ayude!

Julie Lerman has an article on how to split a table

+3

Gracias. Tendré que hacer esto. Pero EF4 debería soportar la carga diferida en propiedades escalares, puede ser realmente útil. –

+0

Sé que el equipo está trabajando para admitir propiedades de carga diferida listas para usar en la próxima versión, pero creo que mover columnas costosas a otra entidad abre vías para retrasar la carga de varias propiedades caras a la vez. Imagine que tiene un objeto empleado con EmployeePicture y la descripción del empleado que son costosos y desea retrasar la carga de ambos, pero siempre que quiera cargarlos, desea cargarlos juntos. Esto es algo que no puedes hacer en linq a sql. – zeeshanhirani

+0

Sí, si hay más de un campo costoso, en este caso el equipo EF puede habilitar un indicador como LoadAllLazyProperties que permite a EF cargar todas las propiedades escalares marcadas como Lazy Load together, cada vez que se solicite. ¡Esto mejora situaciones como la que mencionaste sin separar EntityTypes! –

1

stimms es correcto, pero tenga cuidado al usar la carga diferida. Puede tener problemas de rendimiento y no darse cuenta de que la propiedad se está cargando en una ubicación específica en su código. Esto se debe a que carga los datos cuando usa la propiedad

Prefiero usar la carga explícita. De esta forma sabrá cuándo se cargan y dónde. Aquí hay un enlace que da un ejemplo para LoadProperty http://sankarsan.wordpress.com/2010/05/09/ado-net-entity-framework-data-loading-part-2/

También puede cargar con entusiasmo utilizando el método Include. Ejemplo aquí: http://wildermuth.com/2008/12/28/Caution_when_Eager_Loading_in_the_Entity_Framework

+0

stimms y Dan, no me refiero a una propiedad relacionada, me refiero a un campo (miembro de la clase) como Biografía (cadena en C# o varchar (1024) en SQL Server), que es realmente caro para cargar con la entidad, me gustaría cargarlo perezoso cuando sea necesario. Por lo que sé, esto no funciona en EF4. ¿Hay una manera de hacerlo? –

+1

¿Quieres cargar una propiedad escalar? Justo fuera de mi cabeza, podría tratar de dividir Biografía en Entity y configurarlo como una propiedad de navegación. Entonces podría cargarlo perezoso/ansioso/expicito. Puede haber una manera mejor ... Voy a probar esta teoría cuando tenga la oportunidad. –

+0

Gracias, parece ser la única manera eficiente. –

6

Con una propiedad escalar, la única manera de no cargar selectivamente una cierta propiedad es proyectar en ESQL o L2E:

var q = from p in Context.People 
     select new 
     { 
      Id = p.Id, 
      Name = p.Name // note no Biography 
     }; 

+1 a Dan; Hacer esto perezosamente es peor que cargarlo por adelantado. Si desea controlar la carga, sea explícito.

+0

Gracias por esta sugerencia. Sí, pero esta proyección no es eficiente. En primer lugar, daría como resultado un tipo anónimo que no se puede usar como Personas directamente. Un nuevo objeto People debe crearse e instanciarse correctamente, lo que será una pérdida de tiempo al analizar los objetos. Este tipo tampoco será rastreado por el contexto. –

+2

@Nazaf, estás optimizando prematuramente. –

Cuestiones relacionadas