Ricerca…


Osservazioni

Convention è un insieme di regole predefinite per configurare automaticamente un modello concettuale basato su definizioni di classi di dominio quando si lavora con Code-First. Le convenzioni Code-First sono definite nello spazio dei nomi System.Data.Entity.ModelConfiguration.Conventions ( EF 5 e EF 6 ).

Convenzione chiave primaria

Per impostazione predefinita, una proprietà è una chiave primaria se una proprietà in una classe è denominata "ID" (senza distinzione tra maiuscole e minuscole) o il nome della classe seguito da "ID". Se il tipo della proprietà della chiave primaria è numerico o GUID, verrà configurato come una colonna Identity. Esempio semplice:

public class Room
{ 
    // Primary key 
    public int RoomId{ get; set; } 
    ... 
}

Rimozione delle convenzioni

È possibile rimuovere qualsiasi convenzione definita nello spazio dei nomi System.Data.Entity.ModelConfiguration.Conventions, sovrascrivendo il metodo OnModelCreating .

L'esempio seguente rimuove PluralizingTableNameConvention.

public class EshopContext : DbContext 
{ 
    public DbSet<Product> Products { set; get; }
    . . . 
 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
    } 
}

Per impostazione predefinita EF creerà la tabella DB con il nome della classe di entità suffisso da "s". In questo esempio, Codice primo è configurato per ignorare PluralizingTableName convenzione così, invece di dbo.Products tabella dbo.Product verrà creata tavolo.

Digitare Discovery

Per impostazione predefinita, Code First include nel modello

  1. Tipi definiti come proprietà DbSet nella classe di contesto.
  2. Tipi di riferimento inclusi nei tipi di entità anche se sono definiti in assembly diversi.
  3. Classi derivate anche se solo la classe base è definita come proprietà DbSet

Ecco un esempio, che stiamo solo aggiungendo Company come DbSet<Company> nella nostra classe di contesto:

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

Possiamo vedere che tutte le classi sono incluse nel modello

inserisci la descrizione dell'immagine qui

DecimalPropertyConvention

Per impostazione predefinita, Entity Framework esegue la mappatura delle proprietà decimali in colonne decimali (18,2) nelle tabelle del database.

public class Box
{
    public int Id { set; get; }
    public decimal Length { set; get; }
    public decimal Width { set; get; }
    public decimal Height { set; get; }
}

inserisci la descrizione dell'immagine qui

Possiamo cambiare la precisione delle proprietà decimali:

1.Utilizzo dell'API fluente:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Box>().Property(b => b.Width).HasPrecision(20, 4);
}

inserisci la descrizione dell'immagine qui

Solo la proprietà "Larghezza" è mappata al decimale (20, 4).

2. Sostituisci la convenzione:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<DecimalPropertyConvention>();
    modelBuilder.Conventions.Add(new DecimalPropertyConvention(10, 4));
}

inserisci la descrizione dell'immagine qui

Ogni proprietà decimale è mappata su colonne decimali (10,4).

Convenzione di relazioni

Codice Prima dedurre la relazione tra le due entità usando la proprietà di navigazione. Questa proprietà di navigazione può essere un semplice tipo di riferimento o tipo di raccolta. Ad esempio, abbiamo definito la proprietà di navigazione Standard nella classe Student e la proprietà di navigazione ICollection nella classe Standard. Quindi, Code First creava automaticamente una relazione uno-a-molti tra la tabella di database Standard e Studenti inserendo la colonna di chiave esterna Standard_StandardId nella tabella Studenti.

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

Le entità di cui sopra hanno creato la seguente relazione utilizzando la chiave esterna Standard_StandardId.

inserisci la descrizione dell'immagine qui

Convenzione chiave straniera

Se la classe A è in relazione con la classe B e la classe B ha una proprietà con lo stesso nome e tipo della chiave primaria di A, EF assume automaticamente che la proprietà sia una chiave esterna.

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 questo caso, DepartmentId è una chiave esterna senza specifiche esplicite.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow