2012-08-11 8 views
9

Sto facendo un'app di Windows Phone in cui ho un WebApi in esecuzione in Azure.Come utilizzare prima la libreria di classi portatile e il codice EF?

Sto utilizzando la nuova "Libreria di classi portatili" (http://msdn.microsoft.com/en-us/library/gg597391.aspx) per il mio progetto "Modelli" che è causa condivisa tra il mio WebApi progetto (questo è un normale progetto ASp.NET MVC 4) e il mio progetto Windows Phone.

Questo funziona benissimo e le classi del modello (POCO) sono serializzate e deserializzate come voglio.

Ora voglio iniziare a memorizzare alcuni dei miei modelli/oggetti POCO e vorrei usare il codice EF prima per questo, ma questo è un tipo di problema in quanto non riesco ad aggiungere l'assembly EntityFramework alla mia "Portable Class Library" "progetto, e davvero non mi piacerebbe o perché ho bisogno solo di una piccola parte (gli attributi) nel mio progetto Models.

Quindi, qualche suggerimento su come avvicinarsi al modo migliore?

AGGIORNAMENTO: Bene, sembra che posso effettivamente aggiungere l'assembly EntityFramework al progetto, ma questo non mi è di grande aiuto, poiché gli attributi che devo usare sono presenti in System.ComponentModel.DataAnnotations che non possono essere utilizzato su Windows Phone. Qualche suggerimento ancora?

risposta

12

Non utilizzare attributi. Utilizzare invece API fluente e creare un assembly separato per la persistenza (EF) che farà riferimento all'assembly del modello. L'assembly di persistenza verrà utilizzato dal livello WebAPI.

+0

Grazie, non sapevo che EF avesse un'API fluente. Sembra una grande soluzione che suggerisci lì, farò un tentativo. –

+0

So che è passato molto tempo da quando ho fatto questa domanda, ma questo approccio stava funzionando molto bene per me - grazie :) –

+1

Chiarimento su come farlo? – sabbour

3

Quando ho bisogno di mio dominio-progetto su più piattaforme, di solito:

  1. creare il progetto di libreria .NET-classe standard per il codice di dominio
  2. Per ogni piattaforma creo una libreria di classi specifica piattaforma
  3. Per ogni libreria di classi specifica della piattaforma aggiungo i file dalla libreria di classi .NET standard come collegamenti (Aggiungi file esistenti -> Come collegamento) e quindi vengono aggiornati automaticamente quando si modifica il file collegato o il file originale .
  4. Quando aggiungo un nuovo file alla libreria di classe .NET, lo aggiungo come collegamenti alle librerie di classi specifiche della piattaforma.
  5. Gli attributi specifici della piattaforma (ad esempio Table e ForeignKey che fa parte dell'assembly DataAnnotations) possono essere disattivati ​​utilizzando i tag pre-processore. Diciamo che ho una libreria .NET classe con una classe e una Silverlight-progetto con il file collegato, allora posso includere gli attributi specifici del .NET facendo:

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

e includere solo il DataAnnotations-assembly nella libreria di classi .NET.

So che è più lavoro rispetto all'utilizzo della libreria di classi portatili, ma non è possibile disattivare gli attributi in un PCL come nell'esempio precedente, poiché è possibile fare riferimento solo agli assembly condivisi (che ancora non è DataAnnotations) .

7

Uso un approccio modificato rispetto a quello di Mikkel Hempel, senza la necessità di utilizzare direttive di pre-elaborazione.

  1. Creare uno standard.Libreria di classi netto, chiamare modelle
  2. Creare una classe parziale che rappresenta ciò che si vuole essere condiviso

    public partial class Person 
    { 
        public int Id { get; set; } 
        public string Name { get; set; } 
    } 
    
  3. Per il codice non portabile (come DataAnnotations), creare un'altra classe parziale e utilizzare metadati

    [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. Creare una libreria di classi portatile, e aggiungere la classe dal punto 2 "Come link"