C#.Соглашения по наименованию в Code First

При создании таблиц и их столбцов в базе данных в Entity Framework по умолчанию действуют некоторые соглашения по именованию, которые указывают, какие имена должны быть у таблиц, столбцов, какие типы и т.д. Рассмотрим некоторые из этих соглашений.

Сопоставление типов

Типы SQL Serverа и C# сопоставляются следующим образом:

  • int : int
  • bit : bool
  • char : string
  • date : DateTime
  • datetime : DateTime
  • datetime2 : DateTime
  • decimal : decimal
  • float : double
  • money : decimal
  • nchar : string
  • ntext : string
  • numeric : decimal
  • nvarchar : string
  • real : float
  • smallint : short
  • text : string
  • tinyint : byte
  • varchar : string

NULL и NOT NULL

Все первичные ключи по умолчанию имеют определение NOT NULL.

Столбцы, сопоставляемые со свойствами ссылочных типов (string, array), в базе данных имеют определение NULL, а все значимые типы (DateTime, bool, char, decimal, int, double, float) – NOT NULL.

Если свойство имеет тип Nullable<T>, то оно сопоставляется со столбцом с определением NULL.

Ключи

Entity Framework требует наличия первичного ключа, так как это позволяет ему отслеживать объекты. По умолчанию в качестве ключей EF рассматривает свойства с именем Id или [Название_типа]Id (например, PostId в классе Post).

Как правило, ключи имеют тип int или GUID, но также могут представлять и любой другой примитивный тип.

Названия таблиц и столбцов

С помощью специального класса PluralizationService Entity Framework проводит сопоставление между именами классов моделей и именами таблиц. При этом таблицы получают по умолчанию в качестве названия множественное число в соответствии с правилами английского языка, например, класс User – таблица Users, класс Person – таблица People (но не Persons!).

Названия столбцов получают названия свойств модели.

Если нас не устраивают названия таблиц и столбцов по умолчанию, то мы можем переопределить данный механизм с помощью Fluent API или аннотаций.

This entry was posted in C#. Bookmark the permalink.