Konvence Code First
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 se předá konfiguraci prostřednictvím rozhraní FLUENT API následovaných datovými poznámkami a následnými konvencemi. 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án 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ď objekt odkazu (pokud je násobnost jedna nebo nula nebo 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 za jedním z následujících formátů, představuje cizí klíč pro relaci: "<název vlastnosti hlavního primárního klíče hlavního klíče>" název><hlavní třídy,< název> vlastnosti primárního klíče hlavní třídy><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í nullable, pak Code First nastaví kaskádové odstranění relace. Pokud je cizí klíč závislé entity s možnou hodnotou null, program Code First nenastaví kaskádové odstranění relace a při odstranění objektu zabezpečení se cizí klíč nastaví na hodnotu null. Chování násobnosti a kaskádového odstranění zjištěné konvencí je možné přepsat pomocí rozhraní 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 vlastnosti Navigace ReviewedBooks a AuthoredBooks a Třída Knihy obsahuje vlastnosti navigace Autor a Revidující ), musíte relace nakonfigurovat ručně pomocí datových poznámek nebo rozhraní FLUENT API. Další informace najdete v tématu Datové poznámky – Relace a rozhraní 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; }
}
Připojení ion – konvence řetězců
Informace o konvencích, které DbContext používá ke zjištění připojení, které se má použít, najdete v tématu Připojení iony 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.