Entity Framework
Erste Konventionen für den Code
Suche…
Bemerkungen
Konvention ist ein Satz von Standardregeln zum automatischen Konfigurieren eines konzeptionellen Modells basierend auf Domänenklassendefinitionen bei der Arbeit mit Code-First. Code-First-Konventionen sind im Namespace System.Data.Entity.ModelConfiguration.Conventions definiert ( EF 5 & EF 6 ).
Primärschlüsselkonvention
Eine Eigenschaft ist standardmäßig ein Primärschlüssel, wenn eine Eigenschaft in einer Klasse "ID" (nicht Groß- und Kleinschreibung beachten) oder der Klassenname gefolgt von "ID" lautet. Wenn der Typ der Primärschlüsseleigenschaft numerisch oder GUID ist, wird er als Identitätsspalte konfiguriert. Einfaches Beispiel:
public class Room
{
// Primary key
public int RoomId{ get; set; }
...
}
Konventionen entfernen
Sie können alle im Namensraum "System.Data.Entity.ModelConfiguration.Conventions" definierten Konventionen entfernen, indem Sie die OnModelCreating
Methode überschreiben.
Im folgenden Beispiel wird PluralizingTableNameConvention entfernt.
public class EshopContext : DbContext
{
public DbSet<Product> Products { set; get; }
. . .
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
Standardmäßig erstellt EF eine DB-Tabelle mit dem Entitätsklassennamen mit dem Zusatz 's'. In diesem Beispiel wird der Code zunächst konfiguriert PluralizingTableName Konvention so, statt zu ignorieren dbo.Products
Tabelle dbo.Product
Tabelle erstellt wird.
Geben Sie Discovery ein
Standardmäßig enthält Code First das Modell
- Typen, die als DbSet-Eigenschaft in der Kontextklasse definiert sind.
- Referenztypen, die in Entitätstypen enthalten sind, auch wenn sie in einer anderen Assembly definiert sind.
- Abgeleitete Klassen, auch wenn nur die Basisklasse als DbSet-Eigenschaft definiert ist
Hier ein Beispiel, dass wir in unserer DbSet<Company>
nur Company
als DbSet<Company>
hinzufügen:
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; }
}
Wir können sehen, dass alle Klassen im Modell enthalten sind
DecimalPropertyConvention
Standardmäßig ordnet Entity Framework dezimale Eigenschaften in dezimalen (18,2) Spalten in Datenbanktabellen zu.
public class Box
{
public int Id { set; get; }
public decimal Length { set; get; }
public decimal Width { set; get; }
public decimal Height { set; get; }
}
Wir können die Genauigkeit der Dezimaleigenschaften ändern:
1. Verwenden Sie Fluent API:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Box>().Property(b => b.Width).HasPrecision(20, 4);
}
Nur die Eigenschaft "Width" wird dezimal (20, 4) zugeordnet.
2. Ersetzen Sie die Konvention:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<DecimalPropertyConvention>();
modelBuilder.Conventions.Add(new DecimalPropertyConvention(10, 4));
}
Jede dezimale Eigenschaft wird dezimalen (10,4) Spalten zugeordnet.
Beziehungskonvention
Code Ermitteln Sie zunächst die Beziehung zwischen den beiden Entitäten mithilfe der Navigationseigenschaft. Diese Navigationseigenschaft kann ein einfacher Referenztyp oder ein Auflistungstyp sein. Beispielsweise haben wir die Standardnavigationseigenschaft in der Student-Klasse und die ICollection-Navigationseigenschaft in der Standardklasse definiert. So erstellte Code First automatisch eine Eins-zu-Viele-Beziehung zwischen der Tabelle "Standards" und "Students DB", indem die Fremdschlüsselspalte Standard_StandardId in die Tabelle Students eingefügt wurde.
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; }
}
Die obigen Entitäten erstellten die folgende Beziehung mit dem Fremdschlüssel Standard_StandardId.
Fremdschlüsselübereinkommen
Wenn die Klasse A mit der Klasse B in Beziehung steht und Klasse B eine Eigenschaft mit demselben Namen und Typ wie der Primärschlüssel von A hat, nimmt EF automatisch an, dass die Eigenschaft ein Fremdschlüssel ist.
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 diesem Fall ist DepartmentId ein Fremdschlüssel ohne explizite Angabe.