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

  1. Typen die zijn gedefinieerd als een DbSet-eigenschap in contextklasse.
  2. Referentietypen die zijn opgenomen in entiteitstypen, zelfs als ze in verschillende assemblages zijn gedefinieerd.
  3. 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

voer hier de afbeeldingsbeschrijving in

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

voer hier de afbeeldingsbeschrijving in

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

voer hier de afbeeldingsbeschrijving in

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

voer hier de afbeeldingsbeschrijving in

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.

voer hier de afbeeldingsbeschrijving in

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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow