Entity Framework
Первые соглашения
Поиск…
замечания
Конвенция представляет собой набор правил по умолчанию для автоматической настройки концептуальной модели на основе определений классов домена при работе с Code-First. Соглашения Code-First определены в пространстве имен System.Data.Entity.ModelConfiguration.Conventions ( EF 5 и EF 6 ).
Конвенция о первичном ключе
По умолчанию свойство является первичным ключом, если свойство класса называется «ID» (не чувствительным к регистру) или имя класса, за которым следует «ID». Если тип свойства первичного ключа является числовым или GUID, он будет настроен как столбец идентификатора. Простой пример:
public class Room
{
// Primary key
public int RoomId{ get; set; }
...
}
Удаление конвенций
Вы можете удалить любое из соглашений, определенных в пространстве имен System.Data.Entity.ModelConfiguration.Conventions, путем переопределения метода OnModelCreating
.
В следующем примере удаляется PluralizingTableNameConvention.
public class EshopContext : DbContext
{
public DbSet<Product> Products { set; get; }
. . .
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
По умолчанию EF создаст таблицу БД с именем класса сущности, суффикс которой 's'. В этом примере, Code First настроен игнорировать PluralizingTableName соглашение так, вместо dbo.Products
таблицы dbo.Product
таблица будет создана.
Тип обнаружения
По умолчанию Code First включает в себя модель
- Типы, определенные как свойство DbSet в классе контекста.
- Типы ссылок, включенные в типы сущностей, даже если они определены в разных сборках.
- Производные классы, даже если только базовый класс определяется как свойство DbSet
Вот пример, что мы добавляем Company
только как 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; }
}
Мы видим, что все классы включены в модель
DecimalPropertyConvention
По умолчанию Entity Framework сопоставляет десятичные свойства десятичным (18,2) столбцам в таблицах базы данных.
public class Box
{
public int Id { set; get; }
public decimal Length { set; get; }
public decimal Width { set; get; }
public decimal Height { set; get; }
}
Мы можем изменить точность десятичных свойств:
1. Использовать API Fluent:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Box>().Property(b => b.Width).HasPrecision(20, 4);
}
Только свойство «Ширина» отображается десятичным (20, 4).
2. Замените соглашение:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<DecimalPropertyConvention>();
modelBuilder.Conventions.Add(new DecimalPropertyConvention(10, 4));
}
Каждое десятичное свойство отображается в десятичные (10,4) столбцы.
Конвенция об отношениях
Код Сначала выведите взаимосвязь между двумя объектами, использующими свойство навигации. Это свойство навигации может быть простым ссылочным типом или типом коллекции. Например, мы определили свойство стандартной навигации в классе Student и свойство навигации ICollection в стандартном классе. Таким образом, Code First автоматически создавал отношения «один ко многим» между таблицами стандартов и учеников, вставляя столбец внешнего ключа Standard_StandardId в таблицу «Студенты».
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; }
}
Вышеуказанные объекты создали следующее отношение, используя внешний ключ Standard_StandardId.
Конвенция о внешних ключах
Если класс A связан с классом B, а класс B имеет свойство с тем же именем и тип, что и первичный ключ A, тогда EF автоматически предполагает, что это свойство является внешним ключом.
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; }
}
В этом случае DepartmentId является внешним ключом без явной спецификации.