Kódalapú konvenciók

A Code First lehetővé teszi egy modell leírását C# vagy Visual Basic .NET-osztályok használatával. A modell alapalakját konvenciók segítségével észleli a rendszer. A konvenciók olyan szabálykészletek, amelyekkel automatikusan konfigurálható egy fogalmi modell az osztálydefiníciók alapján a Code First használatakor. A konvenciók a System.Data.Entity.ModelConfiguration.Conventions névtérben vannak definiálva.

A modellt tovább konfigurálhatja adatjegyzetekkel vagy a fluent API-val. A konfigurálás a fluent API-n keresztül történik, amelyet adatjegyzetek, majd konvenciók követnek. További információ: Adatjegyzetek, Fluent API – Kapcsolatok, Fluent API – Típusok & tulajdonságok és Fluent API VB.NET.

A Code First konvenciók részletes listája az API dokumentációjában érhető el. Ez a témakör áttekintést nyújt a Code First által használt konvenciókról.

Típusfelderítés

A Code First fejlesztés során általában olyan .NET Framework osztályokat kell írnia, amelyek meghatározzák a fogalmi (tartományi) modellt. Az osztályok definiálása mellett azt is tudatnia kell a DbContext-el , hogy milyen típusokat szeretne belefoglalni a modellbe. Ehhez meg kell határoznia egy olyan környezeti osztályt, amely a DbContextből származik, és elérhetővé teszi a DbSet-tulajdonságokat azokhoz a típusokhoz, amelyek a modell részét képezik. A Code First tartalmazza ezeket a típusokat, és lekéri a hivatkozott típusokat is, még akkor is, ha a hivatkozott típusok egy másik szerelvényben vannak definiálva.

Ha a típusok egy öröklési hierarchiában vesznek részt, elegendő egy DbSet-tulajdonságot definiálni az alaposztályhoz, és a származtatott típusok automatikusan bekerülnek, ha ugyanabban a szerelvényben vannak, mint az alaposztály.

Az alábbi példában csak egy DbSet tulajdonság van definiálva a SchoolEntities osztályban (Részlegek). A Code First ezt a tulajdonságot használja a hivatkozott típusok felderítésére és lekérésére.

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; }
}

Ha ki szeretne zárni egy típust a modellből, használja a NotMapped attribútumot vagy a DbModelBuilder.Ignore fluent API-t.

modelBuilder.Ignore<Department>();

Elsődleges kulcs konvenciója

A Code First arra a következtetésre jut, hogy egy tulajdonság elsődleges kulcs, ha egy osztály egyik tulajdonsága "ID" (kis- és nagybetű-érzéketlen), vagy ha az osztály neve után "ID" következik. Ha az elsődleges kulcs tulajdonságának típusa numerikus vagy GUID, akkor identitásoszlopként lesz konfigurálva.

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

    . . .  

}

Kapcsolati konvenció

Az Entity Frameworkben a navigációs tulajdonságok lehetővé teszik a két entitástípus közötti kapcsolatok közötti navigálást. Minden objektum rendelkezhet navigációs tulajdonságmal minden olyan kapcsolathoz, amelyben részt vesz. A navigációs tulajdonságok lehetővé teszik, hogy mindkét irányban navigálni és kezelni a kapcsolatokat, és vagy egy referenciaobjektumot (ha a multiplicitás egy vagy nulla vagy egy), vagy egy gyűjteményt (ha a multiplicitás sok) adjanak vissza. A Code First a típusokon definiált navigációs tulajdonságok alapján következtet a kapcsolatokra.

A navigációs tulajdonságok mellett azt javasoljuk, hogy a függő objektumokat képviselő típusok esetében is szerepeljenek idegen kulcstulajdonságok. Az elsődleges elsődleges kulcs tulajdonságával azonos adattípusú és az alábbi formátumok egyikét követő névvel rendelkező tulajdonságok a kapcsolat idegen kulcsát jelölik: "<navigációs tulajdonságnév><elsődleges kulcstulajdonság neve>", "<elsődleges osztály neve><elsődleges kulcstulajdonság neve>", vagy "elsődleges elsődleges kulcs tulajdonságának neve<">. Ha több találat van, a fenti sorrendben történik az elsőbbségi elbírálás. Az idegen kulcsérzékelés nem érzékeny a kis- és nagybetűkre. Ha idegen kulcs tulajdonságot észlel, a Code First a kapcsolat sokaságát az idegen kulcs nullázhatósága alapján állapítja meg. Ha a tulajdonság null értékű, akkor a kapcsolat nem kötelezőként van regisztrálva; ellenkező esetben a kapcsolat szükség szerint van regisztrálva.

Ha a függő entitás idegen kulcsa nem null értékű, akkor a Code First a kaszkádolt törlést állítja be a kapcsolaton. Ha a függő entitás idegen kulcsa null értéket is felvehet, a Code First nem állítja be a lánctörlést a kapcsolatra, és amikor a fő entitás törlődik, az idegen kulcs null értékűre lesz állítva. A konvenció által észlelt többszörös és kaszkádolt törlési viselkedés felülbírálható a fluent API használatával.

Az alábbi példában a navigációs tulajdonságokat és egy idegen kulcsot használjuk a részleg és a kurzusosztályok közötti kapcsolat meghatározásához.

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; }
}

Megjegyzés:

Ha több kapcsolat van ugyanazon típusok között (tegyük fel például, hogy a Személy és a Könyv osztályt definiálja, ahol a Személy osztály tartalmazza a ReviewedBooks és a AuthoredBooks navigációs tulajdonságait, a Könyv osztály pedig a Szerző és a Véleményező navigációs tulajdonságait), manuálisan kell konfigurálnia a kapcsolatokat az Adatjegyzetek vagy a fluent API használatával. További információ: Adatjegyzetek – Kapcsolatok és Fluent API – Kapcsolatok.

Összetett típusok konvenciója

Amikor a Code First felfedez egy osztálydefiníciót, amelyből nem lehet elsődleges kulcsot kikövetkeztetni, és egyetlen elsődleges kulcsot sem regisztrál az adatjegyzeteken vagy a fluent API-n keresztül, akkor a rendszer automatikusan összetett típusként regisztrálja a típust. Az összetett típusészlelés azt is megköveteli, hogy a típusnak ne legyen olyan tulajdonsága, amely entitástípusokra hivatkozik, és nem hivatkozik egy másik típus gyűjteménytulajdonságára. Az alábbi osztálydefiníciók alapján a Code First arra következtet, hogy a Részletek egy összetett típus, mert nincs elsődleges kulcsa.

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; }
}

Kapcsolati karakterlánc konvenció

A DbContext által használt kapcsolatok felfedezésére szolgáló konvenciók megismeréséhez lásd a Kapcsolatok és modellek részt.

Egyezmények eltávolítása

A System.Data.Entity.ModelConfiguration.Conventions névtérben definiált konvenciók bármelyikét eltávolíthatja. Az alábbi példa eltávolítja a PluralizingTableNameConvention parancsot.

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>();
    }
}

Egyéni konvenciók

Az egyéni konvenciók az EF6-tól és későbbi verziókban támogatva vannak. További információ: Egyéni kód – első konvenciók.