Freigeben über


Teil 2: Erstellen der Domänenmodelle

von Rick Anderson

Abgeschlossenes Projekt herunterladen

Modelle hinzufügen

Es gibt drei Möglichkeiten, entity Framework anzugehen:

  • Database-first: Sie beginnen mit einer Datenbank, und Entity Framework generiert den Code.
  • Model-first: Sie beginnen mit einem visuellen Modell, und Entity Framework generiert sowohl die Datenbank als auch den Code.
  • Code zuerst: Sie beginnen mit Code, und Entity Framework generiert die Datenbank.

Wir verwenden den Code-First-Ansatz, daher definieren wir zunächst unsere Domänenobjekte als POCOs (einfache CLR-Objekte). Beim Code-First-Ansatz benötigen Domänenobjekte keinen zusätzlichen Code, um die Datenbankebene zu unterstützen, z. B. Transaktionen oder Persistenz. (Insbesondere müssen sie nicht von der EntityObject-Klasse erben.) Sie können weiterhin Datenanmerkungen verwenden, um zu steuern, wie Entity Framework das Datenbankschema erstellt.

Da POCOs keine zusätzlichen Eigenschaften enthalten, die den Datenbankstatus beschreiben, können sie problemlos in JSON oder XML serialisiert werden. Dies bedeutet jedoch nicht, dass Sie Ihre Entity Framework-Modelle immer direkt für Clients verfügbar machen sollten, wie wir weiter unten im Tutorial sehen werden.

Wir erstellen die folgenden POCOs:

  • Produkt
  • Auftrag
  • OrderDetail

Um jede Klasse zu erstellen, klicken Sie mit der rechten Maustaste auf den Ordner Models in Projektmappen-Explorer. Wählen Sie im Kontextmenü Hinzufügen und dann Klasse aus.

Screenshot des Menüs

Fügen Sie eine Product Klasse mit der folgenden Implementierung hinzu:

namespace ProductStore.Models
{
    using System.ComponentModel.DataAnnotations;

    public class Product
    {
        [ScaffoldColumn(false)]
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }
        public decimal Price { get; set; }
        public decimal ActualCost { get; set; }
    }
}

Gemäß der Konvention verwendet Entity Framework die Id Eigenschaft als Primärschlüssel und ordnet sie einer Identitätsspalte in der Datenbanktabelle zu. Wenn Sie eine neue Product instance erstellen, legen Sie keinen Wert für Idfest, da die Datenbank den Wert generiert.

Das ScaffoldColumn-Attribut weist ASP.NET MVC an, die Id Eigenschaft beim Generieren eines Editorformulars zu überspringen. Das Attribut Required wird verwendet, um das Modell zu überprüfen. Es gibt an, dass die Name Eigenschaft eine nicht leere Zeichenfolge sein muss.

Fügen Sie die -Klasse hinzu Order :

namespace ProductStore.Models
{
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;

    public class Order
    {
        public int Id { get; set; }
        [Required]
        public string Customer { get; set; }

        // Navigation property
        public  ICollection<OrderDetail> OrderDetails { get; set; }
    }
}

Fügen Sie die -Klasse hinzu OrderDetail :

namespace ProductStore.Models
{
    public class OrderDetail
    {
        public int Id { get; set; }
        public int Quantity { get; set; }
        public int OrderId { get; set; }
        public int ProductId { get; set; }

        // Navigation properties
        public Product Product { get; set; }
        public Order Order { get; set; }
    }
}

Foreign Key Relations

Eine Bestellung enthält viele Bestelldetails, und jedes Bestelldetail bezieht sich auf ein einzelnes Produkt. Um diese Beziehungen darzustellen, definiert die OrderDetail -Klasse Eigenschaften mit dem Namen OrderId und ProductId. Entity Framework leitet daraus ab, dass diese Eigenschaften Fremdschlüssel darstellen, und fügt der Datenbank Fremdschlüsseleinschränkungen hinzu.

Screenshot: Visual Studio-Menüs für die Klassen

Die Order Klassen und OrderDetail enthalten auch "Navigationseigenschaften", die Verweise auf die zugehörigen Objekte enthalten. Bei einer Bestellung können Sie zu den Produkten in der Reihenfolge navigieren, indem Sie den Navigationseigenschaften folgen.

Kompilieren Sie das Projekt jetzt. Entity Framework verwendet Reflektion, um die Eigenschaften der Modelle zu ermitteln, sodass eine kompilierte Assembly zum Erstellen des Datenbankschemas erforderlich ist.

Konfigurieren der Media-Type-Formatierer

Ein Medienformatierer ist ein Objekt, das Ihre Daten serialisiert, wenn die Web-API den HTTP-Antworttext schreibt. Die integrierten Formatierungsprogramme unterstützen JSON- und XML-Ausgabe. Standardmäßig serialisieren beide Formatierungsprogramme alle Objekte nach Wert.

Die Serialisierung nach Wert führt zu einem Problem, wenn ein Objektdiagramm Kreisverweise enthält. Dies ist bei den Order Klassen und OrderDetail genau der Fall, da jede einen Verweis auf die andere enthält. Der Formatierer folgt den Verweisen, schreibt jedes Objekt nach Wert und wechselt in Kreisen. Daher müssen wir das Standardverhalten ändern.

Erweitern Sie in Projektmappen-Explorer den Ordner App_Start, und öffnen Sie die Datei WebApiConfig.cs. Fügen Sie der WebApiConfig-Klasse den folgenden Code hinzu:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        // New code:
        var json = config.Formatters.JsonFormatter;
        json.SerializerSettings.PreserveReferencesHandling =
            Newtonsoft.Json.PreserveReferencesHandling.Objects;

        config.Formatters.Remove(config.Formatters.XmlFormatter);
    }
}

Dieser Code legt den JSON-Formatierer so fest, dass Objektverweise beibehalten werden, und der XML-Formatierer wird vollständig aus der Pipeline entfernt. (Sie können den XML-Formatierer so konfigurieren, dass Objektverweise beibehalten werden, aber es ist etwas mehr Arbeit, und wir benötigen nur JSON für diese Anwendung. Weitere Informationen finden Sie unter Behandeln von Zirkelobjektverweise.)