Code First Именован

Code First позволяет описать модель с помощью C# или Visual Basic классов .net. Базовая форма модели определяется с помощью соглашений. Соглашения — это наборы правил, которые используются для автоматической настройки концептуальной модели на основе определений классов при работе с Code First. Соглашения определяются в пространстве имен System. Data. Entity. Моделконфигуратион. Conventions.

Вы можете дополнительно настроить модель с помощью заметок к данным или API Fluent. Приоритет предоставляется в конфигурации через API Fluent, за которым следуют заметки к данным, а затем соглашения. дополнительные сведения см. в статьях заметки к данным, Fluent API-отношения, Fluent свойства типов api и api Fluent с помощью VB.NET.

подробный список соглашений Code First можно найти в документации по API. В этом разделе приводятся общие сведения о соглашениях, используемых Code First.

Обнаружение типов

при использовании Code First разработки обычно начинается написание платформа .NET Framework классов, определяющих концептуальную (доменную) модель. Помимо определения классов необходимо также разрешить DbContext знать, какие типы необходимо включить в модель. Для этого необходимо определить класс контекста, который является производным от DbContext , и предоставляет свойства DbSet для типов, которые должны быть частью модели. Code First будут включать эти типы, а также будут запрашивать ссылочные типы, даже если типы, на которые имеются ссылки, определены в другой сборке.

Если типы участвуют в иерархии наследования, достаточно определить свойство DbSet для базового класса, и производные типы будут автоматически включены в сборку, если они находятся в той же сборке, что и базовый класс.

В следующем примере для класса пункт SchoolEntities определено только одно свойство DbSet (Departments). Code First использует это свойство для обнаружения и извлечения любых ссылочных типов.

public class SchoolEntities : DbContext
{
    public DbSet<Department> Departments { get; set; }
}

public class Department
{
    // Primary key
    public int DepartmentID { get; set; }
    public string Name { get; set; }

    // Navigation property
    public virtual ICollection<Course> Courses { get; set; }
}

public class Course
{
    // Primary key
    public int CourseID { get; set; }

    public string Title { get; set; }
    public int Credits { get; set; }

    // Foreign key
    public int DepartmentID { get; set; }

    // Navigation properties
    public virtual Department Department { get; set; }
}

public partial class OnlineCourse : Course
{
    public string URL { get; set; }
}

public partial class OnsiteCourse : Course
{
    public string Location { get; set; }
    public string Days { get; set; }
    public System.DateTime Time { get; set; }
}

Если необходимо исключить тип из модели, используйте атрибут нотмаппед или API дбмоделбуилдер. Ignore Fluent.

modelBuilder.Ignore<Department>();

Соглашение о первичном ключе

Code First выводит, что свойство является первичным ключом, если свойство класса имеет имя "ID" (без учета регистра), или имя класса, за которым следует "id". Если тип свойства первичного ключа является числовым или идентификатором GUID, он будет настроен в качестве столбца идентификаторов.

public class Department
{
    // Primary key
    public int DepartmentID { get; set; }

    . . .  

}

Соглашение о связях

В Entity Framework свойства навигации обеспечивают возможность навигации по связям между двумя типами сущностей. Каждый объект может обладать свойством навигации для каждого отношения, в котором участвует. Свойства навигации позволяют перемещать связи и управлять ими в обоих направлениях, возвращая либо ссылочный объект (если кратность — либо одна, либо нулевая или-одна), либо коллекция (если количество элементов равно многим). Code First определяет связи на основе свойств навигации, определенных в типах.

В дополнение к свойствам навигации рекомендуется включить свойства внешнего ключа для типов, представляющих зависимые объекты. Любое свойство с тем же типом данных, что и у основного первичного ключа, и с именем, которое следует за одним из следующих форматов, представляет внешний ключ для связи: " < имя свойства навигации >< субъект основного ключа имя свойства > ", " < имя класса основного >< ключа имя свойства > " или " < имя свойства основного ключа субъекта > ". Если найдено несколько совпадений, приоритет передается в указанном выше порядке. При обнаружении внешнего ключа не учитывается регистр. при обнаружении свойства внешнего ключа Code First определяет количество элементов связи на основе допустимости значений null внешнего ключа. Если свойство допускает значение null, то связь регистрируется как необязательнаая. в противном случае связь регистрируется по мере необходимости.

если внешний ключ в зависимой сущности не допускает значения null, то Code First задает каскадное удаление для связи. если внешний ключ в зависимой сущности допускает значение null, Code First не устанавливает каскадное удаление для связи, и при удалении участника внешний ключ будет установлен в значение null. Поведение количества элементов и каскадного удаления, обнаруженное соглашением, может быть переопределено с помощью API Fluent.

В следующем примере свойства навигации и внешний ключ используются для определения связи между классами Department и Course.

public class Department
{
    // Primary key
    public int DepartmentID { get; set; }
    public string Name { get; set; }

    // Navigation property
    public virtual ICollection<Course> Courses { get; set; }
}

public class Course
{
    // Primary key
    public int CourseID { get; set; }

    public string Title { get; set; }
    public int Credits { get; set; }

    // Foreign key
    public int DepartmentID { get; set; }

    // Navigation properties
    public virtual Department Department { get; set; }
}

Примечание

При наличии нескольких связей между одними и теми же типами (например, предположим, что вы определили классы Person и Book , где класс Person содержит свойства навигации ревиеведбукс и Аусоредбукс , а класс Book содержит свойства навигации " Автор " и " проверяющий "), необходимо вручную настроить связи с помощью заметок к данным или API-интерфейса Fluent. дополнительные сведения см. в статье Data annotations-relationships and Fluent API-связи.

Соглашение о сложных типах

когда Code First обнаруживает определение класса, в котором не удается вывести первичный ключ и не зарегистрирован первичный ключ с помощью аннотаций данных или API-интерфейса fluent, тип автоматически регистрируется как сложный тип. Для обнаружения сложного типа также требуется, чтобы тип не имел свойств, ссылающихся на типы сущностей и на которые нет ссылок из свойства коллекции другого типа. учитывая следующие определения классов Code First выводит, что сведения являются сложным типом, так как у него нет первичного ключа.

public partial class OnsiteCourse : Course
{
    public OnsiteCourse()
    {
        Details = new Details();
    }

    public Details Details { get; set; }
}

public class Details
{
    public System.DateTime Time { get; set; }
    public string Location { get; set; }
    public string Days { get; set; }
}

Соглашение строки соединения

Чтобы узнать о соглашениях, которые DbContext использует для обнаружения подключения для использования, см. раздел подключения и модели.

Удаление соглашений

Можно удалить любое из соглашений, определенных в пространстве имен System. Data. Entity. Моделконфигуратион. Conventions. В следующем примере удаляется плурализингтабленамеконвентион.

public class SchoolEntities : DbContext
{
     . . .

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // Configure Code First to ignore PluralizingTableName convention
        // If you keep this convention, the generated tables  
        // will have pluralized names.
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }
}

Настраиваемые соглашения

Пользовательские соглашения поддерживаются в EF6. дополнительные сведения см. в разделе Custom Code First conventions.