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

  1. Typen, die als DbSet-Eigenschaft in der Kontextklasse definiert sind.
  2. Referenztypen, die in Entitätstypen enthalten sind, auch wenn sie in einer anderen Assembly definiert sind.
  3. 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

Geben Sie hier die Bildbeschreibung ein

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; }
}

Geben Sie hier die Bildbeschreibung ein

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);
}

Geben Sie hier die Bildbeschreibung ein

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));
}

Geben Sie hier die Bildbeschreibung ein

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.

Geben Sie hier die Bildbeschreibung ein

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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow