2012-04-19 10 views
8

Estoy desarrollando una aplicación de almacenamiento de archivos y hemos incorporado el tipo FileStream en nuestra base de datos. Se espera que el sistema admita archivos de gran tamaño. Una parte de la aplicación permite cargas masivas de múltiples documentos. Estos documentos deben estar vinculados a otras entidades dentro del sistema.¿Cómo evito que Entity Framework cargue una columna FileStream en una matriz de bytes?

Una página está diseñada para mostrar documentos no vinculados, para permitir a un usuario vincular los documentos de uno en uno a las entidades. Después de realizar algunas pruebas de carga del proceso de carga, descubrimos que la huella de memoria del proceso de trabajo ASP.NET se incrementó a más de un GB al cargar esta página Documentos no vinculados.

Después de la investigación, parece que Entity Framework está cargando toda la entidad de fila del documento (incluido el FileStream, convertido en una matriz de bytes) para cientos de documentos no vinculados. En mi clase de repositorio, no guardo esta matriz de bytes al convertirme en un Modelo, pero para entonces ya es demasiado tarde. EF ha dedicado el tiempo y la memoria para asignar la matriz de bytes a la representación de la clase Repositorio.

¿Hay alguna forma en que pueda decirle a EF que no cargue esta matriz de bytes a menos que yo lo pida explícitamente?

+1

http://stackoverflow.com/a/3293286/782754 No es posible marcar una propiedad de carga lenta, pero se pueden utilizar otros conceptos –

Respuesta

11

Garrison, puede usar una característica llamada "división de entidades" donde asigna dos entidades relacionadas a una sola tabla. Entonces, en la primera entidad tendrías todas menos la propiedad filestream. En la segunda entidad, tendrías la clave principal (igual que en la primera entidad) y la propiedad filestream. Cree una relación uno: uno entre las entidades en su modelo y luego asigne ambas entidades a la misma tabla. Ahora la entidad con filestream está relacionada y puede cargarla o cargarla de forma lenta según sea necesario. El único inconveniente es que no es una propiedad de su entidad principal, por lo que debe navegar a la entidad relacionada y luego a la propiedad.

myEntity.MyRelatedEntity.TheFileStreamProperty

He aquí un old blog post escribí que muestra cómo hacer esto en el diseñador de EDM.

También puede lograr la misma asignación con Code FIrst. Aquí hay un artículo de MSDN que escribí que contiene un artículo de división de entidades. http://msdn.microsoft.com/en-us/data/hh272551

HTH Julie

+0

Gracias, Julie. ¡Esto es justo lo que estaba buscando! –

+0

¡genial para escuchar! :) –

Cuestiones relacionadas