Część 2. Tworzenie modeli domeny
Autor: Rick Anderson
Pobieranie ukończonego projektu
Dodawanie modeli
Istnieją trzy sposoby podejścia do programu Entity Framework:
- Najpierw baza danych: rozpoczynasz od bazy danych, a platforma Entity Framework generuje kod.
- Najpierw model: zaczynasz od modelu wizualnego, a platforma Entity Framework generuje zarówno bazę danych, jak i kod.
- Najpierw kod: zaczynasz od kodu, a platforma Entity Framework generuje bazę danych.
Używamy podejścia bazującego na kodzie, więc zaczynamy od zdefiniowania obiektów domeny jako obiektów POC (zwykłych obiektów CLR). W przypadku podejścia opartego na kodzie obiekty domeny nie wymagają dodatkowego kodu do obsługi warstwy bazy danych, takich jak transakcje lub trwałość. (W szczególności nie muszą dziedziczyć z klasy EntityObject ). Nadal można używać adnotacji danych do kontrolowania sposobu tworzenia schematu bazy danych przez program Entity Framework.
Ponieważ obiekty POCO nie zawierają żadnych dodatkowych właściwości opisujących stan bazy danych, można je łatwo serializować w formacie JSON lub XML. Nie oznacza to jednak, że zawsze należy uwidaczniać modele programu Entity Framework bezpośrednio klientom, jak zobaczymy w dalszej części tego samouczka.
Utworzymy następujące obiekty weryfikacji koncepcji:
- Produkt
- Zamówienie
- Orderdetail
Aby utworzyć każdą klasę, kliknij prawym przyciskiem myszy folder Models w Eksplorator rozwiązań. Z menu kontekstowego wybierz pozycję Dodaj , a następnie wybierz pozycję Klasa.
Dodaj klasę z następującą implementacją Product
:
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; }
}
}
Zgodnie z konwencją platforma Entity Framework używa Id
właściwości jako klucza podstawowego i mapuje ją na kolumnę tożsamości w tabeli bazy danych. Podczas tworzenia nowego Product
wystąpienia nie ustawisz wartości , Id
ponieważ baza danych generuje wartość .
Atrybut ScaffoldColumn informuje ASP.NET MVC, aby pominąć Id
właściwość podczas generowania formularza edytora. Wymagany atrybut służy do weryfikowania modelu. Określa, że Name
właściwość musi być ciągiem niepustym.
Dodaj klasę 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; }
}
}
Dodaj klasę 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; }
}
}
Stosunki kluczowe dla spraw zagranicznych
Zamówienie zawiera wiele szczegółów zamówienia, a każdy szczegół zamówienia odnosi się do pojedynczego produktu. Aby reprezentować te relacje, OrderDetail
klasa definiuje właściwości o nazwach OrderId
i ProductId
. Program Entity Framework wywnioskuje, że te właściwości reprezentują klucze obce i doda ograniczenia klucza obcego do bazy danych.
Klasy Order
i OrderDetail
zawierają również właściwości "nawigacji", które zawierają odwołania do powiązanych obiektów. Po zamówieniu możesz przejść do produktów w podanej kolejności, postępując zgodnie z właściwościami nawigacji.
Skompiluj teraz projekt. Program Entity Framework używa odbicia w celu odnalezienia właściwości modeli, dlatego wymaga skompilowanego zestawu do utworzenia schematu bazy danych.
Konfigurowanie modułów formatowania Media-Type
Formater typu nośnika to obiekt, który serializuje dane, gdy internetowy interfejs API zapisuje treść odpowiedzi HTTP. Wbudowane formatery obsługują dane wyjściowe JSON i XML. Domyślnie oba te formatery serializują wszystkie obiekty według wartości.
Serializacja według wartości powoduje problem, jeśli graf obiektu zawiera odwołania cykliczne. Dokładnie tak jest w Order
przypadku klas i OrderDetail
, ponieważ każda z nich zawiera odwołanie do drugiego. Program formatujący będzie podążać za odwołaniami, zapisywać każdy obiekt według wartości i przechodzić w okręgi. W związku z tym musimy zmienić zachowanie domyślne.
W Eksplorator rozwiązań rozwiń folder App_Start i otwórz plik o nazwie WebApiConfig.cs. Dodaj następujący kod do WebApiConfig
klasy :
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);
}
}
Ten kod ustawia formater JSON w celu zachowania odwołań do obiektów i całkowicie usuwa formater XML z potoku. (Można skonfigurować formatter XML, aby zachować odwołania do obiektów, ale jest to nieco więcej pracy i potrzebujemy tylko formatu JSON dla tej aplikacji. Aby uzyskać więcej informacji, zobacz Obsługa odwołań do obiektów cyklicznych).