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.
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 Id
fest, 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.
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.)