Část 2: Vytvoření doménových modelů
Rick Anderson
Přidat modely
Existují tři způsoby, jak přistupovat k Rozhraní Entity Framework:
- První databáze: Začnete s databází a Entity Framework vygeneruje kód.
- Model je první: Začnete s vizuálním modelem a Entity Framework vygeneruje databázi i kód.
- Code-first: Začnete kódem a Entity Framework vygeneruje databázi.
Používáme přístup založený na kódu, takže začneme definováním objektů domény jako objektů POCO (prosté staré objekty CLR). U přístupu založeného na kódu nepotřebují objekty domény žádný další kód pro podporu databázové vrstvy, jako jsou transakce nebo trvalost. (Konkrétně nemusí dědit z třídy EntityObject .) Pomocí datových poznámek můžete řídit, jak Entity Framework vytváří schéma databáze.
Vzhledem k tomu, že objekty POCO neobsahují žádné další vlastnosti, které popisují stav databáze, je možné je snadno serializovat na JSON nebo XML. To ale neznamená, že byste měli modely Entity Framework vždy vystavit přímo klientům, jak uvidíme později v tomto kurzu.
Vytvoříme následující poceo:
- Produkt
- Objednávka
- Orderdetail
Pokud chcete vytvořit jednotlivé třídy, klikněte pravým tlačítkem na složku Models v Průzkumník řešení. V místní nabídce vyberte Přidat a pak vyberte Třída.
Product
Přidejte třídu s následující implementací:
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; }
}
}
Podle konvence Entity Framework používá Id
vlastnost jako primární klíč a mapuje ji na sloupec identity v tabulce databáze. Když vytvoříte novou Product
instanci, nenastavíte hodnotu pro Id
, protože databáze tuto hodnotu vygeneruje.
Atribut ScaffoldColumn říká ASP.NET MVC, aby při generování formuláře editoru Id
vlastnost přeskočil. Atribut Required se používá k ověření modelu. Určuje, že Name
vlastnost musí být neprázdný řetězec.
Order
Přidejte třídu:
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; }
}
}
OrderDetail
Přidejte třídu:
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; }
}
}
Zahraniční klíčové vztahy
Objednávka obsahuje mnoho podrobností o objednávce a každý detail objednávky odkazuje na jeden produkt. Pro reprezentaci OrderDetail
těchto vztahů třída definuje vlastnosti s názvem OrderId
a ProductId
. Entity Framework odvodí, že tyto vlastnosti představují cizí klíče, a přidá do databáze omezení cizího klíče.
Třídy Order
a OrderDetail
také obsahují "navigační" vlastnosti, které obsahují odkazy na související objekty. Na základě objednávky můžete přejít na produkty v pořadí pomocí navigačních vlastností.
Zkompilujte projekt. Entity Framework používá reflexi ke zjišťování vlastností modelů, takže k vytvoření schématu databáze vyžaduje kompilované sestavení.
Konfigurace Media-Type Formátovačů
Formátovací modul typu média je objekt, který serializuje data, když webové rozhraní API zapisuje tělo odpovědi HTTP. Integrované formátovací moduly podporují výstup JSON a XML. Ve výchozím nastavení oba tyto formátovací moduly serializují všechny objekty podle hodnoty.
Serializace podle hodnoty vytvoří problém, pokud graf objektů obsahuje cyklické odkazy. To je přesně případ Order
tříd a OrderDetail
, protože každá z nich obsahuje odkaz na druhou. Formátovací modul bude následovat odkazy, zapíše každý objekt podle hodnoty a přejde do kruhů. Proto musíme změnit výchozí chování.
V Průzkumník řešení rozbalte složku App_Start a otevřete soubor s názvem WebApiConfig.cs. Do třídy přidejte následující kód WebApiConfig
:
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);
}
}
Tento kód nastaví formátovací modul JSON tak, aby zachoval odkazy na objekty, a zcela odebere formátovací modul XML z kanálu. (Formátovací modul XML můžete nakonfigurovat tak, aby zachoval odkazy na objekty, ale je to trochu práce a pro tuto aplikaci potřebujeme jenom JSON. Další informace najdete v tématu Zpracování cyklických odkazů na objekty.)