Entity Framework
Conventions de code premier
Recherche…
Remarques
Convention est un ensemble de règles par défaut permettant de configurer automatiquement un modèle conceptuel basé sur les définitions de classe de domaine lorsque vous travaillez avec Code-First. Les conventions Code-First sont définies dans l'espace de noms System.Data.Entity.ModelConfiguration.Conventions ( EF 5 & EF 6 ).
Convention clé primaire
Par défaut, une propriété est une clé primaire si une propriété d'une classe s'appelle «ID» (non sensible à la casse), ou le nom de la classe suivi de «ID». Si le type de la propriété de clé primaire est numérique ou GUID, il sera configuré en tant que colonne d'identité. Exemple simple:
public class Room
{
// Primary key
public int RoomId{ get; set; }
...
}
Suppression de conventions
Vous pouvez supprimer l'une des conventions définies dans l'espace de noms System.Data.Entity.ModelConfiguration.Conventions, en OnModelCreating
méthode OnModelCreating
.
L'exemple suivant supprime PluralizingTableNameConvention.
public class EshopContext : DbContext
{
public DbSet<Product> Products { set; get; }
. . .
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
Par défaut, EF créera une table de base de données avec le nom de la classe d'entité suffixé par «s». Dans cet exemple, le code est d' abord configuré pour ignorer la convention PluralizingTableName donc, au lieu de dbo.Products
tableau dbo.Product
table sera créée.
Type de découverte
Par défaut, le code d'abord inclut dans le modèle
- Types définis en tant que propriété DbSet dans la classe de contexte.
- Les types de référence inclus dans les types d'entités même s'ils sont définis dans des assemblages différents.
- Classes dérivées même si seule la classe de base est définie comme propriété DbSet
Voici un exemple, nous ajoutons seulement Company
comme DbSet<Company>
dans notre classe de contexte:
public class Company
{
public int Id { set; get; }
public string Name { set; get; }
public virtual ICollection<Department> Departments { set; get; }
}
public class Department
{
public int Id { set; get; }
public string Name { set; get; }
public virtual ICollection<Person> Staff { set; get; }
}
[Table("Staff")]
public class Person
{
public int Id { set; get; }
public string Name { set; get; }
public decimal Salary { set; get; }
}
public class ProjectManager : Person
{
public string ProjectManagerProperty { set; get; }
}
public class Developer : Person
{
public string DeveloperProperty { set; get; }
}
public class Tester : Person
{
public string TesterProperty { set; get; }
}
public class ApplicationDbContext : DbContext
{
public DbSet<Company> Companies { set; get; }
}
Nous pouvons voir que toutes les classes sont incluses dans le modèle
DecimalPropertyConvention
Par défaut, Entity Framework mappe les propriétés décimales sur des colonnes décimales (18,2) dans les tables de base de données.
public class Box
{
public int Id { set; get; }
public decimal Length { set; get; }
public decimal Width { set; get; }
public decimal Height { set; get; }
}
Nous pouvons changer la précision des propriétés décimales:
1.Utilisez l'API Fluent:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Box>().Property(b => b.Width).HasPrecision(20, 4);
}
Seule la propriété "Width" est mappée en décimal (20, 4).
2. Remplacez la convention:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<DecimalPropertyConvention>();
modelBuilder.Conventions.Add(new DecimalPropertyConvention(10, 4));
}
Chaque propriété décimale est mappée sur des colonnes décimales (10,4).
Convention Relationnelle
Code Commencez par déduire la relation entre les deux entités en utilisant la propriété de navigation. Cette propriété de navigation peut être un type de référence simple ou un type de collection. Par exemple, nous avons défini la propriété de navigation Standard dans la propriété Student et la propriété de navigation ICollection dans la classe Standard. Ainsi, Code First a automatiquement créé une relation un-à-plusieurs entre Standards et la table des étudiants en insérant la colonne de clé étrangère Standard_StandardId dans la table Students.
public class Student
{
public int StudentID { get; set; }
public string StudentName { get; set; }
public DateTime DateOfBirth { get; set; }
//Navigation property
public Standard Standard { get; set; }
}
public class Standard
{
public int StandardId { get; set; }
public string StandardName { get; set; }
//Collection navigation property
public IList<Student> Students { get; set; }
}
Les entités ci-dessus ont créé la relation suivante à l'aide de la clé étrangère Standard_StandardId.
Convention sur la clé étrangère
Si la classe A est en relation avec la classe B et que la classe B a une propriété avec le même nom et le même type que la clé primaire de A, alors EF suppose automatiquement que la propriété est une clé étrangère.
public class Department
{
public int DepartmentId { set; get; }
public string Name { set; get; }
public virtual ICollection<Person> Staff { set; get; }
}
public class Person
{
public int Id { set; get; }
public string Name { set; get; }
public decimal Salary { set; get; }
public int DepartmentId { set; get; }
public virtual Department Department { set; get; }
}
Dans ce cas, DepartmentId est une clé étrangère sans spécification explicite.