2012-08-11 9 views
9

Ich mache eine Windows Phone App, in der ich einen WebApi in Azure ausführen lasse.Wie arbeite ich mit der Portable Class Library und dem EF-Code zuerst?

Ich verwende die neue "Portable Class Library" (http://msdn.microsoft.com/en-us/library/gg597391.aspx) für mein "Models" -Projekt, das von meinem WebApi freigegeben wird Projekt (das ist ein normales ASp.NET MVC 4 Projekt) und mein Windows Phone Projekt.

Das funktioniert gut und die Modell (POCO) -Klassen werden serialisiert und deserialisiert, wie ich will.

Jetzt möchte ich einige meiner Modelle/POCO-Objekte speichern und möchte zuerst EF-Code dafür verwenden, aber das ist ein Problem, da ich die EntityFramework-Assembly nicht zu meiner "Portable Class Library" hinzufügen kann "Projekt, und eigentlich möchte ich auch nicht, da ich nur einen kleinen Teil (die Attribute) in meinem Models-Projekt brauche.

Also, irgendwelche Vorschläge, wie ein Ansatz dies der beste Weg?

UPDATE: Nun, es scheint, als ob ich die EntityFramework Assembly tatsächlich dem Projekt hinzufügen kann, aber das hilft mir nicht wirklich, da die Attribute, die ich verwenden muss, in System.ComponentModel.DataAnnotations lebt unter Windows Phone verwendet werden. Irgendwelche Vorschläge noch?

Antwort

12

Verwenden Sie keine Attribute. Verwenden Sie stattdessen die fließende API und erstellen Sie eine separate Assembly for Persistence (EF), die auf Ihre Modellbaugruppe verweist. Die Persistenzassemblierung wird von Ihrer WebAPI-Ebene verwendet.

+0

Danke, wusste nicht, dass EF eine flüssige API hatte. Scheint wie eine großartige Lösung, die Sie vorschlagen, ich werde es versuchen. –

+0

Wissen, es ist lange her, seit ich diese Frage gestellt habe, aber diese Herangehensweise funktionierte sehr gut für mich - danke :) –

+1

Klarstellung, wie man das macht? – sabbour

3

Wenn ich meine Domain-Projekt über mehrere Plattformen hinweg benötigen, ich in der Regel:

  1. Erstellen Sie die Standard-.NET-Klassenbibliothek Projekt für den Domain-Code
  2. Für jede Plattform ich eine plattformspezifische Klassenbibliothek erstellen
  3. Für jede plattformspezifische Klassenbibliothek füge ich die Dateien aus der Standard-.NET-Klassenbibliothek als Verknüpfungen hinzu (Vorhandene Dateien hinzufügen -> Als Verknüpfung) und sie werden automatisch aktualisiert, wenn Sie die verknüpfte Datei oder die Originaldatei bearbeiten .
  4. Wenn ich der .NET-Klassenbibliothek eine neue Datei hinzufüge, füge ich sie als Verknüpfungen zu den plattformspezifischen Klassenbibliotheken hinzu.
  5. Plattformspezifische Attribute (z. B. Tabelle und ForeignKey, die Teil der DataAnnotations-Assembly ist) können mithilfe der Vorprozessortags ausgeschlossen werden. Lets sagen, dass ich eine .NET-Klassenbibliothek mit einer Klasse und einem Silverlight-Projekt mit der verknüpften Datei, dann kann ich die .NET-spezifische Attribute enthalten, indem Sie:

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

und umfassen nur die DataAnnotations-Assembly in der .NET-Klassenbibliothek.

Ich weiß, es ist mehr Arbeit als die Verwendung der Portable Class Library, aber Sie können Attribute in einer PCL nicht wie im obigen Beispiel deaktivieren, da Sie nur auf geteilte Assemblys verweisen dürfen (was wiederum DataAnnotations nicht ist) .

7

Ich benutze einen modifizierten Ansatz als Mikkel Hempel, ohne die Notwendigkeit, Pre-Processing-Richtlinien zu verwenden.

  1. Erstellen Sie einen Standard.NET-Klassenbibliothek, nennen es Modelle
  2. eine partielle Klasse erstellen darstellt, was Sie gemeinsam genutzt werden

    wollen
    public partial class Person 
    { 
        public int Id { get; set; } 
        public string Name { get; set; } 
    } 
    
  3. Für nicht-portablen Code (wie DataAnnotations), erstellen Sie eine andere partielle Klasse und verwenden Metadaten

    [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. erstellen Portable Klassenbibliothek, und fügen Sie die Klasse aus Schritt 2 "als Verknüpfung"

Verwandte Themen