Konwencje Code First

Funkcja Code First umożliwia opisywanie modelu przy użyciu klas języka C# lub Visual Basic platformy .NET. Podstawowy kształt modelu jest wykrywany przy użyciu konwencji. Konwencje to zestawy reguł, które są używane do automatycznego konfigurowania modelu koncepcyjnego na podstawie definicji klas podczas pracy z code first. Konwencje są definiowane w przestrzeni nazw System.Data.Entity.ModelConfiguration.Conventions.

Model można dodatkowo skonfigurować przy użyciu adnotacji danych lub płynnego interfejsu API. Pierwszeństwo jest przypisywane do konfiguracji za pośrednictwem płynnego interfejsu API, po którym następują adnotacje danych, a następnie konwencje. Aby uzyskać więcej informacji, zobacz Adnotacje danych, Fluent API — Relacje, Fluent API — Typy i właściwości oraz Interfejs API Fluent z VB.NET.

Szczegółowa lista konwencji Code First jest dostępna w dokumentacji interfejsu API. Ten temat zawiera omówienie konwencji używanych przez program Code First.

Odnajdywanie typów

W przypadku korzystania z programowania Code First zwykle zaczynasz od pisania klas programu .NET Framework, które definiują model koncepcyjny (domena). Oprócz definiowania klas należy również poinformować DbContext , które typy mają zostać uwzględnione w modelu. W tym celu należy zdefiniować klasę kontekstu, która pochodzi z obiektu DbContext i uwidacznia właściwości DbSet dla typów, które mają być częścią modelu. Code First będzie zawierać te typy, a także ściągnąć wszelkie przywołynięte typy, nawet jeśli przywołynięte typy są zdefiniowane w innym zestawie.

Jeśli typy uczestniczą w hierarchii dziedziczenia, wystarczy zdefiniować właściwość DbSet dla klasy bazowej, a typy pochodne zostaną automatycznie uwzględnione, jeśli znajdują się w tym samym zestawie co klasa podstawowa.

W poniższym przykładzie istnieje tylko jedna właściwość DbSet zdefiniowana w klasie SchoolEntities (Departments). Code First używa tej właściwości do odnajdywania i ściągania wszystkich typów, do których się odwołujesz.

public class SchoolEntities : DbContext
{
    public DbSet<Department> Departments { get; set; }
}

public class Department
{
    // Primary key
    public int DepartmentID { get; set; }
    public string Name { get; set; }

    // Navigation property
    public virtual ICollection<Course> Courses { get; set; }
}

public class Course
{
    // Primary key
    public int CourseID { get; set; }

    public string Title { get; set; }
    public int Credits { get; set; }

    // Foreign key
    public int DepartmentID { get; set; }

    // Navigation properties
    public virtual Department Department { get; set; }
}

public partial class OnlineCourse : Course
{
    public string URL { get; set; }
}

public partial class OnsiteCourse : Course
{
    public string Location { get; set; }
    public string Days { get; set; }
    public System.DateTime Time { get; set; }
}

Jeśli chcesz wykluczyć typ z modelu, użyj atrybutu NotMapped lub interfejsu API DbModelBuilder.Ignore fluent API.

modelBuilder.Ignore<Department>();

Konwencja klucza podstawowego

Code First wywnioskuje, że właściwość jest kluczem podstawowym, jeśli właściwość klasy nosi nazwę "ID" (nie uwzględnia wielkości liter) lub nazwę klasy, po której następuje "ID". Jeśli typ właściwości klucza podstawowego to numeryczny lub GUID, zostanie skonfigurowany jako kolumna tożsamości.

public class Department
{
    // Primary key
    public int DepartmentID { get; set; }

    . . .  

}

Konwencja relacji

W programie Entity Framework właściwości nawigacji zapewniają sposób nawigowania po relacji między dwoma typami jednostek. Każdy obiekt może mieć właściwość nawigacji dla każdej relacji, w której uczestniczy. Właściwości nawigacji umożliwiają nawigowanie po relacjach i zarządzanie nimi w obu kierunkach, zwracanie obiektu odwołania (jeśli wielokrotność jest jedną lub zero-lub-jedną) lub kolekcją (jeśli wielokrotność jest wiele). Funkcja Code First wywnioskuje relacje na podstawie właściwości nawigacji zdefiniowanych na typach.

Oprócz właściwości nawigacji zalecamy dołączenie właściwości klucza obcego do typów reprezentujących obiekty zależne. Każda właściwość o tym samym typie danych co główna właściwość klucza podstawowego i o nazwie, która jest zgodna z jednym z następujących formatów, reprezentuje klucz obcy dla relacji: "<><główna nazwa głównej właściwości klucza podstawowego nazwa> właściwości klucza podstawowego", "><<główna nazwa> właściwości klucza podstawowego" lub "<główna nazwa> właściwości klucza podstawowego". Jeśli znaleziono wiele dopasowań, pierwszeństwo jest podane w kolejności wymienionej powyżej. Wykrywanie klucza obcego nie uwzględnia wielkości liter. Po wykryciu właściwości klucza obcego funkcja Code First wywnioskuje mnożenie relacji na podstawie wartości null klucza obcego. Jeśli właściwość ma wartość null, relacja jest zarejestrowana jako opcjonalna; w przeciwnym razie relacja jest zarejestrowana zgodnie z potrzebami.

Jeśli klucz obcy jednostki zależnej nie jest dopuszczalny do wartości null, funkcja Code First ustawia kaskadowe usunięcie relacji. Jeśli klucz obcy jednostki zależnej ma wartość null, funkcja Code First nie ustawia kaskadowego usuwania relacji, a gdy podmiot zabezpieczeń zostanie usunięty, klucz obcy zostanie ustawiony na wartość null. Zachowanie wielokrotnego i kaskadowego usuwania wykryte zgodnie z konwencją może zostać zastąpione przy użyciu płynnego interfejsu API.

W poniższym przykładzie właściwości nawigacji i klucz obcy są używane do definiowania relacji między klasami Department i Course.

public class Department
{
    // Primary key
    public int DepartmentID { get; set; }
    public string Name { get; set; }

    // Navigation property
    public virtual ICollection<Course> Courses { get; set; }
}

public class Course
{
    // Primary key
    public int CourseID { get; set; }

    public string Title { get; set; }
    public int Credits { get; set; }

    // Foreign key
    public int DepartmentID { get; set; }

    // Navigation properties
    public virtual Department Department { get; set; }
}

Uwaga

Jeśli masz wiele relacji między tymi samymi typami (na przykład załóżmy, że zdefiniujesz klasy Person i Book, w których klasa Person zawiera właściwości nawigacji ReviewedBooks i AuthoredBooks, a klasa Book zawiera właściwości nawigacji Autor i Recenzent), musisz ręcznie skonfigurować relacje przy użyciu adnotacji danych lub płynnego interfejsu API. Aby uzyskać więcej informacji, zobacz Adnotacje danych — Relacje i Fluent API — Relacje.

Konwencja typów złożonych

Gdy funkcja Code First odnajduje definicję klasy, w której nie można wywnioskować klucza podstawowego, a żaden klucz podstawowy nie jest rejestrowany za pomocą adnotacji danych lub płynnego interfejsu API, typ jest automatycznie rejestrowany jako typ złożony. Wykrywanie typów złożonych wymaga również, aby typ nie miał właściwości odwołujących się do typów jednostek i nie odwołuje się do właściwości kolekcji w innym typie. Biorąc pod uwagę następujące definicje klas Code First, wywnioskuje, że Details jest typem złożonym, ponieważ nie ma klucza podstawowego.

public partial class OnsiteCourse : Course
{
    public OnsiteCourse()
    {
        Details = new Details();
    }

    public Details Details { get; set; }
}

public class Details
{
    public System.DateTime Time { get; set; }
    public string Location { get; set; }
    public string Days { get; set; }
}

Połączenie ion String Convention (Konwencja ciągu Połączenie ion)

Aby dowiedzieć się więcej o konwencjach używanych przez element DbContext do odnajdywania połączenia do użycia, zobacz Połączenie ions and Models (Modele i Połączenie ions).

Usuwanie konwencji

Można usunąć dowolną konwencję zdefiniowaną w przestrzeni nazw System.Data.Entity.ModelConfiguration.Conventions. Poniższy przykład usuwa pluralizowanieTableNameConvention.

public class SchoolEntities : DbContext
{
     . . .

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // Configure Code First to ignore PluralizingTableName convention
        // If you keep this convention, the generated tables  
        // will have pluralized names.
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }
}

Konwencje niestandardowe

Konwencje niestandardowe są obsługiwane w programie EF6. Aby uzyskać więcej informacji, zobacz Niestandardowe konwencje Code First.