Entity Framework
Code First Conventies
Zoeken…
Opmerkingen
Convention is een set standaardregels voor het automatisch configureren van een conceptueel model op basis van definities van domeinklassen bij het werken met Code-First. Code-First-conventies worden gedefinieerd in de naamruimte System.Data.Entity.ModelConfiguration.Conventions ( EF 5 & EF 6 ).
Primaire sleutelconventie
Standaard is een eigenschap een primaire sleutel als een eigenschap op een klasse de naam "ID" (niet hoofdlettergevoelig) heeft, of de klassennaam gevolgd door "ID". Als het type van de primaire sleuteleigenschap numeriek of GUID is, wordt dit geconfigureerd als een identiteitskolom. Eenvoudig voorbeeld:
public class Room
{
// Primary key
public int RoomId{ get; set; }
...
}
Conventies verwijderen
U kunt alle conventies verwijderen die zijn gedefinieerd in de naamruimte System.Data.Entity.ModelConfiguration.Conventions door de methode OnModelCreating
overschrijven.
In het volgende voorbeeld wordt PluralizingTableNameConvention verwijderd.
public class EshopContext : DbContext
{
public DbSet<Product> Products { set; get; }
. . .
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
Standaard maakt EF een DB-tabel met de naam van de entiteitsklasse met het teken 's'. In dit voorbeeld is Code First geconfigureerd om PluralizingTableName conventie te negeren dat zo is, in plaats van dbo.Products
tafel dbo.Product
tafel zal worden gecreëerd.
Typ Discovery
Standaard wordt Code First in het model opgenomen
- Typen die zijn gedefinieerd als een DbSet-eigenschap in contextklasse.
- Referentietypen die zijn opgenomen in entiteitstypen, zelfs als ze in verschillende assemblages zijn gedefinieerd.
- Afgeleide klassen, zelfs als alleen de basisklasse is gedefinieerd als de eigenschap DbSet
Hier is een voorbeeld dat we alleen Company
toevoegen als DbSet<Company>
in onze DbSet<Company>
:
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; }
}
We kunnen zien dat alle klassen in het model zijn opgenomen
DecimalPropertyConvention
Standaard wijst Entity Framework decimale eigenschappen toe aan decimale (18,2) kolommen in databasetabellen.
public class Box
{
public int Id { set; get; }
public decimal Length { set; get; }
public decimal Width { set; get; }
public decimal Height { set; get; }
}
We kunnen de precisie van decimale eigenschappen wijzigen:
1.Gebruik vloeiende API:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Box>().Property(b => b.Width).HasPrecision(20, 4);
}
Alleen de eigenschap "Breedte" wordt toegewezen aan decimalen (20, 4).
2. Vervang de conventie:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<DecimalPropertyConvention>();
modelBuilder.Conventions.Add(new DecimalPropertyConvention(10, 4));
}
Elke decimale eigenschap wordt toegewezen aan decimale (10,4) kolommen.
Relatie Conventie
Code Leid eerst de relatie tussen de twee entiteiten af met behulp van de navigatie-eigenschap. Deze navigatie-eigenschap kan een eenvoudig referentietype of verzamelingstype zijn. We hebben bijvoorbeeld de standaard navigatie-eigenschap in de klasse Student en de ICollection-navigatie-eigenschap in de klasse Standard gedefinieerd. Code First creëerde dus automatisch een één-op-veel-relatie tussen de normen en de DB-tabel voor studenten door de kolom Standard_StandardId in de tabel Studenten in te voegen.
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; }
}
De bovenstaande entiteiten hebben de volgende relatie gemaakt met behulp van de standaardsleutel Standard_StandardId.
Buitenlandse sleutelconventie
Als klasse A in relatie staat met klasse B en klasse B eigenschap heeft met dezelfde naam en hetzelfde type als de primaire sleutel van A, dan neemt EF automatisch aan dat eigenschap een externe sleutel is.
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; }
}
In dit geval is DepartmentId een externe sleutel zonder expliciete specificatie.