2010-09-07 14 views
6

Usando Entity framework v4 y las plantillas de generador de entidades POCO T4.Detener EF desde entidades de carga al asignar asociación

El problema que tengo es que los métodos de reparación están cargando cientos de entidades cuando asigno una entidad asociada (ver la línea 4 a continuación).

Dim context = New SomeEntities 
Dim list = context.Lists.FirstOrDefault(Function(l) l.ListId = 2) 
Dim queryDetail = context.CreateObject(Of QueryDetail)() 
queryDetail.CriteriaColumnType = context.CriteriaColumnTypes.FirstOrDefault(Function(cct) cct.CriteriaColumnTypeId = 145) 

La entidad CriteriaColumnType que está siendo asignado tiene una colección de QueryDetail objetos, y cuando se realiza la asignación, el método de corrección en la entidad de CriteriaColumnType es la carga diferida toda la QueryDetails asociado.

¿Cómo puedo crear la asociación FK y adjuntar la entidad CriteriaColumnType a mi entidad QueryDetail sin cargar todos los registros CriteriaColumnType'sQueryDetail?

+0

Para aclarar, tiene un 'QueryDetail' con una propiedad llamada' CriteriaColumnType' que contiene una colección de otros 'QueryDetail's. –

Respuesta

1

¿Necesita pereza la carga aquí? Puede desactivarlo:

context.ContextOptions.LazyLoadingEnabled = false 
+1

Realmente consideré usar eso, pero se siente como un truco. ¡Parece difícil de creer que el usuario ocasional de Enitity Framework realmente quisiera cargar la colección completa de la entidad asociada en este caso! –

+1

No creo que sea hacky. El contexto es una unidad de trabajo. No todos los UOW necesitan carga lenta. No tiene que afectar a otros UOW, que pueden necesitar carga lenta. –

+1

Estoy de acuerdo con Steve. Si la única forma de evitar este comportamiento es desactivar la carga diferida, se debe considerar como un error. La única razón de este problema es el seguimiento de cambios (propiedades de navegación FixUp en ambos lados de la asociación). El código asigna valor a la propiedad de navegación por un lado. A su vez, quiere asignar el valor a la recopilación de navegación en el otro lado pero, debido al acceso a la colección, inicia la carga diferida. –

1

Me encontré con este problema también. Una operación que solía tomar milisegundos comenzó a tardar de 3 a 4 segundos en ejecutarse, todo porque agregué una propiedad de navegación que apuntaba a una tabla grande.

He resuelto el problema simplemente borrando todo el código de corrección de la plantilla T4; nuestro proyecto no necesita esa funcionalidad de todos modos. Eliminé todo de esta línea:

region.Begin("Association Fixup"); 

a la próxima región. Última() llamada. También eliminé todas las llamadas a los métodos de reparación de los establecedores de propiedades, el registro de los manejadores de CollectionChanged y el indicador _settingFK.


Consulte esta pregunta para obtener más información sobre por qué el código de reparación está allí: Why is "Fixup" needed for Persistence Ignorant POCO's in EF 4?. Está intentando asegurarse de que si cambia un extremo de una asociación bidireccional, el otro extremo también se actualiza. Por lo tanto, por ejemplo, si crea un nuevo BlogPost y configura su propiedad de Usuario para un usuario, la lógica de corrección agregará automáticamente la publicación a la colección de Publicaciones del usuario.

marc_s respondió la otra pregunta enlazando a POCO Template Code Generation Options. Al eliminar el código de corrección de la plantilla T4, la plantilla cambia de # 2 (POCO básico con corrección) a # 1 (POCO básico sin corrección).

Cuestiones relacionadas