2011-02-28 18 views
9

Estoy creando un ORM utilizando Entity Frameworks 4.0 (CTP5) en el patrón Model-First. Algunas de mis entidades tienen propiedades complejas (árbol de objetos) que no necesitan ser entidades ORM: solo son de interés para los sistemas de servidor de fondo que usan esta base de datos, no para los clientes que usan esta base de datos.Cómo especificar el tipo de datos XML de SQL Server en el modelo de Entity Frameworks 4.0?

Podría simplemente serializar el árbol de objetos de la propiedad en una cadena y almacenarlo en el DB como una cadena, pero el tipo de datos XML de SQL Server es realmente atractivo. Sería muy agradable poder consultar sobre los contenidos de datos XML de una manera inteligente.

Sin embargo, no veo ninguna forma de especificar que deseo un tipo de datos XML en el Visual Studio Entity Modeler.

¿Es la única manera de hacer esto para especificar los campos de cadena en el modelo, emitir el DDL y luego modificar el DDL para cambiar los campos de cadena a campos XML? Eso parece terriblemente frágil y escribir una vez, cambiar nunca. ¿Hay una mejor manera?

+2

Por cierto, ya no es "SQL XML". Es solo una parte integrada de SQL Server. –

+0

No te servirá de nada en el corto plazo, pero puedes votar sobre esto: http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1051783-xml-data-type -soporte –

Respuesta

8

En "Entity Framework 4.0 Recipes", Larry Tenny y Zeeshan Hirani afirman que los tipos de datos XML simplemente no son compatibles con EF 4.0.

Ofrecen una solución, que consiste en hacer que la propiedad del tipo de cadena en la clase de entidad generada por el modelo sea privada y crear una nueva propiedad (en su propia clase parcial de la clase de entidad) para devolver un XElement del interno propiedad de la cadena:

public partial class Candidate 
{ 
    private XElement candidateResume = null; 

    public XElement CandidateResume 
    { 
     get 
     { 
      if (candidateResume == null) 
      { 
       candidateResume = XElement.Parse(this.Resume); 
       candidateResume.Changed += (s,e) => 
       { 
        this.Resume = candidateResume.ToString(); 
       } 
      } 

      return candidateResume; 
     } 

     set 
     { 
      candidateResume = value; 
      candidateResume.Changed += (s,e) => 
      { 
       this.Resume = candidateResume.ToString(); 
      } 
      this.Resume = value.ToString(); 
     } 
    } 
} 

Creación de una propiedad sombra del tipo XML deseado como esto debería funcionar, pero la conversión entre la cadena y XML en cada cambio de la propiedad original de cadena (Reanudar) y la nueva propiedad de sombra (CandidateResume) es bastante caro

Si alguien tiene alguna idea mejor, todavía estoy abierto a sugerencias.

0

He encontrado una manera de enmascarar el hecho de que Entity Framework asigna la propiedad XML a una propiedad String, utilizando un tipo complejo oculto. Aunque esto requiere que modifique cada entidad afectada antes de guardarla en la base de datos. A grandes rasgos, utilizo el hecho de que Entity Framework le permite especificar los tipos internos en su archivo .csdl.

he describe mi enfoque en un detalle poco aquí: .net ORM Comparison

que también acaba de instalar el CTP5 a echar un vistazo al enfoque de código en primer lugar, para ver si se puede utilizar el mismo enfoque sin tener una archivo .edmx o .csdl. Editaré esta respuesta si encuentro otra manera.

+0

¡Suena prometedor! – dthorpe

+0

No tuve suerte en mi primer intento. Simple porque no pude descifrar cómo trabajar directamente con el tipo complejo. Si pudiera mostrarme lo que obtuvo hasta ahora o qué enfoque de primer código está tomando (me confundí con DbContext, DbSet, etc.), podría simplemente "engancharme" en él. –

Cuestiones relacionadas