Поиск…


замечания

Конвенция представляет собой набор правил по умолчанию для автоматической настройки концептуальной модели на основе определений классов домена при работе с 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 включает в себя модель

  1. Типы, определенные как свойство DbSet в классе контекста.
  2. Типы ссылок, включенные в типы сущностей, даже если они определены в разных сборках.
  3. Производные классы, даже если только базовый класс определяется как свойство 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 является внешним ключом без явной спецификации.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow