2012-08-11 22 views
9

Estoy haciendo una aplicación de Windows Phone donde tengo un WebApi ejecutándose en Azure.¿Cómo trabajar con Portable Class Library y EF Code-first?

Estoy usando la nueva "Biblioteca de clases portátil" (http://msdn.microsoft.com/en-us/library/gg597391.aspx) para mi proyecto de "Modelos" que es de causa compartida entre mi WebApi proyecto (este es un proyecto normale ASp.NET MVC 4) y mi proyecto Windows Phone.

Esto funciona muy bien y las clases modelo (POCO) se serializan y se deserializan como yo quiero.

Ahora quiero comenzar a almacenar algunos de mis objetos de Modelos/POCO y me gustaría usar EF Code primero para eso, pero eso es un problema ya que no puedo agregar el ensamblado EntityFramework a mi "Biblioteca de clases portátil" "proyecto, y realmente tampoco me gustaría, ya que solo necesito una pequeña parte (los atributos) en mi proyecto de Modelos.

¿Alguna sugerencia sobre cómo abordar esto de la mejor manera?

ACTUALIZACIÓN: Bueno, parece que realmente puedo agregar el ensamblado EntityFramework al proyecto, pero eso realmente no me ayuda, ya que los atributos que necesito utilizar se encuentran en System.ComponentModel.DataAnnotations que no pueden ser utilizado en Windows Phone. ¿Alguna sugerencia todavía?

Respuesta

12

No utilice atributos. Use una API fluida en su lugar y cree un ensamble por separado para la persistencia (EF) que hará referencia al ensamblaje de su modelo. El ensamblaje de persistencia será el uso utilizado por su capa de WebAPI.

+0

Gracias, no sabía que EF tenía una API fluida. Parece una gran solución que sugieres, lo intentaré. –

+0

Sepa que es hace mucho tiempo desde que hice esta pregunta, pero este enfoque funcionó muy bien para mí - gracias :) –

+1

¿Hay alguna aclaración sobre cómo hacerlo? – sabbour

3

Cuando necesito mi dominio en proyectos a través de múltiples plataformas, por lo general:

  1. crear el proyecto de biblioteca de clases de .NET estándar para el código de dominio
  2. para cada plataforma se crea una biblioteca de clases específico de la plataforma
  3. Para cada biblioteca de clase específica de plataforma agrego los archivos de la biblioteca .NET-class estándar como enlaces (Agregar archivos existentes -> Como enlace) y por lo tanto se actualizan automáticamente cuando edita el archivo vinculado o el archivo original .
  4. Cuando agrego un archivo nuevo a la biblioteca .NET-class, lo agrego como enlaces a las bibliotecas de clases específicas de la plataforma.
  5. Los atributos específicos de plataforma (es decir, Table y ForeignKey que forman parte del conjunto de anotaciones de datos) se pueden excluir utilizando las etiquetas del preprocesador. Digamos que tengo una biblioteca de clase .NET con una clase y un proyecto de Silverlight con el archivo vinculado, entonces puedo incluir los atributos-NET específica haciendo:

    #if !SILVERLIGHT 
    [Table("MyEntityFrameworkTable")] 
    #endif 
    public class MyCrossPlatformClass 
    { 
        // Blah blah blah 
    } 
    

y sólo incluirá la DataAnnotations-assembly en la biblioteca de clase .NET.

Sé que es más trabajo que usar la Biblioteca de clases portátil, pero no puede optar por los atributos en una PCL como en el ejemplo anterior, ya que solo puede hacer referencia a conjuntos compartidos (que nuevamente no es DataAnnotaciones) .

7

Utilizo un enfoque modificado que el de Mikkel Hempel, sin la necesidad de utilizar directivas de preprocesamiento.

  1. Crear una norma.biblioteca de clases .NET, lo llaman modelos
  2. Crear una clase parcial que representa lo que quiere ser compartido

    public partial class Person 
    { 
        public int Id { get; set; } 
        public string Name { get; set; } 
    } 
    
  3. Para el código no portátil (como DataAnnotations), crear otra clase parcial y el uso de metadatos

    [MetadataTypeAttribute(typeof(Person.Metadata))] 
    public partial class Person 
    { 
        internal sealed class Metadata 
        { 
         private Metadata() { } // Metadata classes shouldn't be instantiated 
    
         // Add metadata attributes to perform validation 
         [Required] 
         [StringLength(60)] 
         public string Name; 
        } 
    } 
    
  4. Crear una biblioteca de clases portátiles, y añadir la clase a partir del paso 2 "Como Enlace"

Cuestiones relacionadas