Entity Framework
Code First Conventions
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
- Tipi definiti come proprietà DbSet nella classe di contesto.
- Tipi di riferimento inclusi nei tipi di entità anche se sono definiti in assembly diversi.
- 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
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; }
}
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);
}
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));
}
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.
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.