Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Code First umožňuje popsat model pomocí tříd C# nebo Visual Basic .NET. Základní tvar modelu se detekuje pomocí konvencí. Konvence jsou sady pravidel, která se používají k automatické konfiguraci konceptuálního modelu založeného na definicích tříd při práci s Code First. Konvence jsou definovány v oboru názvů System.Data.Entity.ModelConfiguration.Conventions.
Model můžete dále nakonfigurovat pomocí datových poznámek nebo rozhraní API fluent. Priorita je dána konfiguraci prostřednictvím fluent API, následují datové poznámky a poté konvence. Další informace najdete v tématu Datové poznámky, rozhraní Fluent API – Relace, Fluent API – Typy a vlastnosti a rozhraní Fluent API s VB.NET.
Podrobný seznam konvencí Code First je k dispozici v dokumentaci k rozhraní API. Toto téma obsahuje přehled konvencí používaných code First.
Zjišťování typů
Při použití vývoje Code First obvykle začínáte psaním tříd rozhraní .NET Framework, které definují váš konceptuální (doménový) model. Kromě definování tříd musíte také dát DbContext vědět, které typy chcete zahrnout do modelu. Chcete-li to provést, definujete kontextovou třídu, která je odvozena z DbContext a zveřejňuje vlastnosti DbSet pro typy, které chcete být součástí modelu. Code First bude obsahovat tyto typy a také bude stahovat všechny odkazované typy, i když jsou odkazované typy definovány v jiném sestavení.
Pokud se vaše typy účastní hierarchie dědičnosti, stačí definovat DbSet vlastnost základní třídy a odvozené typy budou automaticky zahrnuty, pokud jsou ve stejném sestavení jako základní třída.
V následujícím příkladu existuje pouze jedna vlastnost DbSet definovaná ve třídě SchoolEntities (Departments). Code First používá tuto vlastnost ke zjišťování a načítání všech odkazovaných typů.
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; }
}
Pokud chcete vyloučit typ z modelu, použijte atribut NotMapped nebo DbModelBuilder.Ignore fluent API.
modelBuilder.Ignore<Department>();
Konvence primárního klíče
Code First odvodí, že vlastnost je primární klíč, pokud vlastnost třídy má název "ID" (nerozlišuje se malá a velká písmena) nebo název třídy následovaný "ID". Pokud je typ vlastnosti primárního klíče číselný nebo GUID, bude nakonfigurována jako sloupec identity.
public class Department
{
// Primary key
public int DepartmentID { get; set; }
. . .
}
Konvence relací
Ve službě Entity Framework poskytují navigační vlastnosti způsob, jak přecházet mezi dvěma typy entit. Každý objekt může mít navigační vlastnost pro každou relaci, do které se účastní. Navigační vlastnosti umožňují procházet a spravovat relace v obou směrech a vracet buď referenční objekt (pokud je násobnost jedna nebo nula až jedna), nebo kolekci (pokud je násobnost mnoho). Code First odvodí relace na základě navigačních vlastností definovaných ve vašich typech.
Kromě navigačních vlastností doporučujeme zahrnout vlastnosti cizího klíče do typů, které představují závislé objekty. Jakákoli vlastnost se stejným datovým typem jako vlastnost hlavního primárního klíče a s názvem, který následuje jeden z následujících formátů, představuje cizí klíč pro relaci: "<název navigační vlastnosti><název vlastnosti hlavního primárního klíče>", "<název hlavní třídy><název vlastnosti primárního klíče>" nebo "<název vlastnosti hlavního primárního klíče>". Pokud se najde více shod, zobrazí se priorita v uvedeném pořadí. Detekce cizího klíče nerozlišuje malá a velká písmena. Když je zjištěna vlastnost cizího klíče, Code First odvodí násobnost relace na základě nullability cizího klíče. Pokud je vlastnost nullable, relace je registrována jako volitelná; v opačném případě je relace registrována podle potřeby.
Pokud cizí klíč závislé entity není možné nastavit jako null, pak Code First nastaví kaskádové odstranění na relaci. Pokud je cizí klíč závislé entity nastaven na null, Code First nenastaví kaskádové odstranění vztahu a při odstranění hlavní entity se cizí klíč nastaví na hodnotu null. Chování multiplicity a kaskádového odstranění detekované konvencí lze přepsat pomocí fluent API.
V následujícím příkladu se vlastnosti navigace a cizí klíč používají k definování vztahu mezi třídami Oddělení a Kurz.
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; }
}
Poznámka:
Pokud máte více relací mezi stejnými typy (předpokládejme například, že definujete třídy Person a Book, kde Třída Person obsahuje navigační vlastnosti ReviewedBooks a AuthoredBooks a Třída Knihy obsahuje navigační vlastnosti Autor a Revidující), musíte relace nakonfigurovat ručně pomocí datových anotací nebo fluent API. Další informace najdete v tématu Datové poznámky – Relace a Fluent API – Relace.
Konvence komplexních typů
Když Code First zjistí definici třídy, kde primární klíč nelze odvodit, a žádný primární klíč není registrován prostřednictvím datových poznámek nebo rozhraní API fluent, typ se automaticky zaregistruje jako komplexní typ. Detekce komplexního typu také vyžaduje, aby typ neměl vlastnosti odkazované na typy entit a neodkazoval se z vlastnosti kolekce na jiném typu. Vzhledem k následujícím definicám tříd Code First by odvodil, že Details je komplexní typ, protože nemá žádný primární klíč.
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; }
}
Konvence připojovacího řetězce
Informace o konvencích, které DbContext používá ke zjištění připojení pro použití, najdete v tématu Připojení a modely.
Odebírání konvencí
Můžete odebrat některou z konvencí definovaných v oboru názvů System.Data.Entity.ModelConfiguration.Conventions. Následující příklad odebere PluralizingTableNameConvention.
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>();
}
}
Vlastní konvence
Vlastní konvence jsou podporovány v EF6 dále. Další informace naleznete v tématu Vlastní konvence Code First.