Entity Framework: Consejos y trucos, Parte 4

Continuamos una serie de informes sobre el uso de Entity Framework. En este artículo, abordamos los siguientes temas:

1. MS SQL Server y Oracle: ¿cómo usar ambos en un proyecto EF?

Problema:

Estoy usando Entity Framework con SQL Server y necesito actualizar a una base de datos Oracle. ¿Cómo puedo hacer eso? ¿Y es posible lanzar bases de datos Oracle y SQL Server al mismo tiempo sin duplicar el código del proyecto?

Solución:

Para resolver esta situación, siga estos pasos:

  • Haz una copia de la tuya .edmx establezca una conexión real con Oracle y ejecute el asistente Generar base de datos a partir del modelo. Como resultado, obtiene un nuevo modelo de trabajo de EF Oracle
  • Cambio Procesamiento de artefactos de metadatos propiedad a Copiar a directorio de salida para ambos modelos
  • Cambie las líneas de conexión en consecuencia (apuntando al mismo .csdl. .Msl. Y diferentes recursos .ssdl)

Básicamente, eso es todo.

En cuanto a los comentarios de los usuarios, Paul Reynolds, uno de nuestros usuarios, creó una serie de mensajes basados ​​en su experiencia al realizar una tarea similar:

Prepárese para múltiples bases de datos

Configuración SSDL

La base de datos LINQ agnóstica es esencialmente

Si está interesado en Model First, eche un vistazo a esta publicación de Vagif Abilov. No te pierdas nuestro comentario.

2. DDL se genera con palabras clave incorrectas.

Problema:

Traté de crear un DDL específico de Oracle a partir de un modelo de concepto (generado originalmente desde SQL Server), instalé una plantilla de generación de DDL en "Devart SSDLToOracle.tt", pero el script contiene algunos tipos que no son compatibles con Oracle (por ejemplo, "varchar (máx.)" o "Fecha y hora"). ¿Es esto un error?

Solución:

Comente la cadena de conexión de contexto en el archivo de configuración de la aplicación (App.Config / Web.Config) y vuelva a ejecutar el asistente de creación de base de datos desde el modelo. Asegúrese de que la conexión sea correcta en el primer paso del asistente y la secuencia de comandos DDL se creará correctamente.

3. ¿Cuál es la diferencia entre .edml y .edmx modelos?

Problema:

¿Existen diferencias significativas entre los modelos de Entidad de Devart y los modelos de Entidad de Microsoft? En particular, no pude agregar un procedimiento de Oracle guardado que tenía un cursor de referencia como parámetro de salida. .edmx modelo.

Solución:

La estructura de los modelos esenciales de Microsoft y Devart es casi idéntica. Hay algunos elementos de visualización adicionales que le permiten obtener funciones adicionales, como la herencia de TPC y TPT, la generación de código de archivo por clase, la vista previa y el procesamiento de procedimientos almacenados.

En cuanto a los cursores de Oracle, lea nuestro artículo de blog: Trabaje con cursores de Oracle y procedimientos almacenados en Entity Framework.

No hay manera de lidiar con esta situación mientras se desarrolla con el diseñador de modelos de datos de esencia.

4. ¿Por qué la configuración del atributo StoreGeneratedPattern en "Identidad" o "Calculado" en Visual Studio 2010 no funciona como se esperaba?

Problema:

Tengo un campo con el valor predeterminado especificado en la base de datos. Establecí StoreGeneratedPattern en "Identificador" para la propiedad correspondiente en Entity Data Model Designer, pero esto no tiene ningún efecto: Oracle da el error de que nulo se inserta en un campo sin cero. ¿Cuál es la causa del problema?

Solución:

Asegúrese de cambiar el atributo StoredGeneratedPattern en la parte Store del modelo. Este es un problema conocido con el diseñador de modelos de datos de entidad de Visual Studio, no realiza ningún cambio en el atributo StoreGeneratedPattern si se cambia durante el desarrollo (solo se cambia el atributo de anotación conceptual: StoreGeneratedPattern). La solución es abrir el modelo con cualquier editor XML y agregar StoreGeneratedPattern="Identidad" en la propiedad requerida en la parte del modelo SSDL.

5. ¿Cómo puedo evitar descargar toda la colección secundaria?

Problema:

Estoy tratando de obtener un subconjunto de las propiedades de la entidad secundaria en la consulta, por ejemplo:

var parents = from p in context.Parents select p;
foreach (var parent in parents)
{
  var children = from c in parent.Children
                 select new {
                   c.ID,
                   c.Name
                 };
}

El caso es que el SQL generado que veo en OracleMonitor es demasiado agresivo. Carga la entidad secundaria completa y solo entonces se filtra LINQ to Objects. ¿Es un error o me perdí algo?

Solución:

Cuando usted llama padres.niñosEl mecanismo EF Lazy Loading carga toda la colección y elige uno nuevo la propuesta es solo una consulta LINQ to Objects y se ejecuta en la memoria. Como solución alternativa, puede utilizar, por ejemplo, la siguiente sintaxis:

var parents = from p in context.Parents select p;
foreach (var parent in parents)
{
    var children = from c in context.Children
               where c.ParentID == parent.ParentID
               select new {
                 c.Id,
                 c.Name
               };
}

Esta declaración creará la consulta que está esperando.


Esperamos que este material le resulte útil. Por favor dé su opinión y sugerencias en los comentarios al artículo.

Artículos de interés

Subir