Část 2: Vytvoření doménových modelů

Rick Anderson

Stáhnout dokončený projekt

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.

Snímek obrazovky s nabídkou Průzkumník řešení pro složku Modely Nabídka Přidat je otevřená a možnost Třída je zvýrazněná.

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.

Snímek obrazovky s nabídkami sady Visual Studio pro třídy Orders, Products a OrderDetails

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.)