Entity Framework
Kod Pierwsze konwencje
Szukaj…
Uwagi
Konwencja to zestaw domyślnych reguł do automatycznej konfiguracji modelu koncepcyjnego na podstawie definicji klas domen podczas pracy z Code-First. Konwencje Code-First są zdefiniowane w przestrzeni nazw System.Data.Entity.ModelConfiguration.Conventions ( EF 5 i EF 6 ).
Konwencja dotycząca klucza podstawowego
Domyślnie właściwość jest kluczem podstawowym, jeśli właściwość klasy ma nazwę „ID” (bez rozróżniania wielkości liter) lub nazwę klasy, po której następuje „ID”. Jeśli typ właściwości klucza podstawowego jest numeryczny lub GUID, zostanie on skonfigurowany jako kolumna tożsamości. Prosty przykład:
public class Room
{
// Primary key
public int RoomId{ get; set; }
...
}
Usuwanie konwencji
Można usunąć dowolną konwencję zdefiniowaną w przestrzeni nazw System.Data.Entity.ModelConfiguration.Conventions, zastępując metodę OnModelCreating
.
Poniższy przykład usuwa PluralizingTableNameConvention.
public class EshopContext : DbContext
{
public DbSet<Product> Products { set; get; }
. . .
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
Domyślnie EF utworzy tabelę DB z nazwą klasy encji przedrostkiem „s”. W tym przykładzie, kod Najpierw jest skonfigurowany tak, aby ignorować konwencję PluralizingTableName więc, zamiast dbo.Products
stół dbo.Product
zostanie utworzona tabela.
Wpisz Discovery
Domyślnie Code First obejmuje w modelu
- Typy zdefiniowane jako właściwość DbSet w klasie kontekstowej.
- Typy odniesienia zawarte w typach encji, nawet jeśli są zdefiniowane w innym zestawie.
- Klasy pochodne, nawet jeśli tylko klasa podstawowa jest zdefiniowana jako właściwość DbSet
Oto przykład, że dodajemy Company
jako DbSet<Company>
w naszej klasie kontekstowej:
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; }
}
Widzimy, że wszystkie klasy są zawarte w modelu
DecimalPropertyConvention
Domyślnie Entity Framework odwzorowuje właściwości dziesiętne na kolumny dziesiętne (18,2) w tabelach bazy danych.
public class Box
{
public int Id { set; get; }
public decimal Length { set; get; }
public decimal Width { set; get; }
public decimal Height { set; get; }
}
Możemy zmienić dokładność właściwości dziesiętnych:
1. Użyj płynnego interfejsu API:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Box>().Property(b => b.Width).HasPrecision(20, 4);
}
Tylko właściwość „Szerokość” jest odwzorowywana na dziesiętną (20, 4).
2. Zastąp konwencję:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<DecimalPropertyConvention>();
modelBuilder.Conventions.Add(new DecimalPropertyConvention(10, 4));
}
Każda właściwość dziesiętna jest odwzorowana na kolumny dziesiętne (10,4).
Konwencja o stosunkach międzyludzkich
Kod Najpierw wywnioskuj relacje między dwoma podmiotami za pomocą właściwości nawigacji. Ta właściwość nawigacji może być prostym typem odwołania lub typem kolekcji. Na przykład zdefiniowaliśmy Standardową właściwość nawigacji w klasie Uczeń i właściwość nawigacji ICollection w klasie Standard. Tak więc Code First automatycznie utworzył relację jeden do wielu między Standardami a tabelą DB Studentów, wstawiając kolumnę klucza obcego Standard_StandardId do tabeli Studentów.
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; }
}
Powyższe jednostki utworzyły następującą relację przy użyciu klucza obcego Standard_StandardId.
Konwencja o kluczach obcych
Jeśli klasa A ma związek z klasą B, a klasa B ma właściwość o tej samej nazwie i typie co klucz podstawowy A, wówczas EF automatycznie zakłada, że właściwość jest kluczem obcym.
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; }
}
W tym przypadku DepartmentId jest kluczem obcym bez wyraźnej specyfikacji.