Cómo almacenar en caché DbCompiledModel (o solo sus metadatos) en un caché distribuido

Trabajo en un proyecto Entity Framework Code First con un gran dbContext (más de 800 entidades).

El problema que tengo es que toma hasta 30 segundos construir y compilar los metadatos por primera vez y no puedo permitirme que todos los servidores de la granja retrasen la primera solicitud (WCF) de esa manera, incluso con la ayuda de AppFabric WarmUp. módulo. Una opción es almacenar en caché el modelo compilado en una memoria caché distribuida, de modo que otros servidores de la granja puedan aprovechar un modelo ya existente al crear una instancia de DbContext.

Algunas cosas que descubrí:

  • Una instancia de DbCompiledModel no se puede serializar;
  • DbCompiledModel usa una implementación de 'ICachedMetadataWorkspace' para almacenar en caché sus metadatos, llamada 'CodeFirstCachedMetadataWorkspace';
  • 'CodeFirstCachedMetadataWorkspace' (o incluso 'ICachedMetadataWorkspace') podría usarse para proporcionar un espacio de trabajo serializable (junto con la ayuda de un método 'DbDatabaseMapping.ToMetadataWorkspace') que se almacenará como xml en la memoria caché distribuida;

Desafortunadamente, todos los tipos mencionados están definidos como internos por EF Code First (excepto, por supuesto, DbCompiledModel) y hasta ahora no pude encontrar una forma adecuada de almacenar esto en caché fuera del proceso.

Otra cosa que probé fue tener un ObjectContext personalizado (para usarlo en el constructor DbContext) donde generar/cargar programáticamente las asignaciones csdl, ssdl y msl (del esquema db), pero las vistas reales (clases poco) aún permanecen sin asignar al contexto general de la base de datos.

Cualquier ayuda es muy apreciada.

Gracias.

preguntado el 12 de junio de 12 a las 11:06

Hay algunas cosas que puedes hacer aquí, pero primero quiero aclarar cuál es el problema. Por lo general, con modelos grandes, la generación de vistas lleva mucho más tiempo que la creación del modelo real. Así que asumo que ya debe estar usando vistas generadas previamente aquí. Si no, eso sería lo primero que intentaría. Puede usar las herramientas eléctricas de EF para eso. Mire la sección Generar vistas de esta publicación: blogs.msdn.com/b/adonet/archive/2012/04/09/… -

La idea es que ya tengo más de 800 entidades en el modelo, y con un gran equipo de proyecto sería difícil mantener y sincronizar tanto las entidades POCO (el código EF 4.1 primero) como las vistas precompiladas (de ahí la necesidad de tiempo de ejecución). generación de las vistas precompiladas). Y debido a que la caché distribuida de App Fabric ya está en su lugar (caché común para servidores back-end), el requisito era enviar las vistas precompiladas a la caché distribuida, para que cada servidor pudiera tomarlas y acelerar el tiempo de inicialización. Gracias. -

No creo que actualmente haya alguna forma de hacerlo. No creo que haya una manera de extraer las vistas que se han compilado en tiempo de ejecución de modo que pueda usarlas en cualquier otro lugar, incluso con acceso a MetadataWorkspace. La capacidad de usar el estado del modelo compilado serializado está en nuestro trabajo pendiente, pero no estará en EF5. -

Gracias Arturo por tu tiempo. Seguiré observando la evolución de EF, la serialización del modelo compilado de db es una disminución importante del tiempo de inicialización en un contexto de granja. -

1 Respuestas

Pruebe esta publicación de blog de Arthur Vickers en el equipo EF: http://blog.oneunicorn.com/2012/04/21/code-first-building-blocks/

Muestra específicamente cómo almacenar en caché un modelo compilado.

Respondido el 12 de junio de 12 a las 15:06

Ya lo intenté, desafortunadamente, una vez que creó ModelBuilder y compiló DbModel, el DbCompiledModel resultante no se puede serializar para transportarlo al sistema de caché distribuido. Solo se puede usar/almacenar en caché en el mismo dominio de aplicación en el que se creó. - Ionut

He señalado a Arthur de esta manera. Si se puede hacer, él lo sabrá. Por otro lado, ¿qué tal (un truco), creando un EDMX a partir del modelo en tiempo de ejecución? Eso es XML. Puedes mover eso. Sin embargo, no estoy seguro de qué haría con él después de moverlo a través del cable. ;) - julie lerman

@JulieLerman ¿Podría esto DbCompiledModel ser serializado a JSON guardado como un archivo en el directorio de la aplicación y luego ser deserializado en Application_Start? Ya estoy generando las vistas y guardándolas en archivos XML. Almacenamiento en caché DbCompiledModel también podría ayudar con mi arranque en frío inicial para consultas. - Isa Fram

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.