В DbContext.OnModelCreating
вы получаете DbModelBuilder
объект.Вы сообщаете этому объекту имена таблиц / столбцов вашей DbSets
и отношения между таблицами.
Например, если у вас есть класс Country
, и вы хотите назвать таблицу Countries
(вместо значения по умолчанию Countrys
вы бы написали:
modelBuilder.Entity<Country>().ToTable("Countries");
Позже, при переносе базы данных на более новую версию вызывается метод DbMigration.Up()
.
Предположим, я хочу добавитьстолбец с сокращенным названием страны (например, «Великобритания» для «Великобритания»)
public override void Up()
{
this.AddColumn(..., // name of table
"Abbreviation",
column => column.String(nullable: true, maxLength: 10));
}
Я знаю, что где-то в моем DbContext фактическое имя таблицы, которая связана с моим DbSet<Country>
В конце концов, всякий раз, когда я сохраняю сделанные мной изменения в DbSet<Country>
, DbContext знает имя таблицы, которую нужно изменить.
Поэтому, чтобы получить имя таблицы, я подумал, что долженспросите у моего DbMigration
, который DbContext
мигрирует, но я не могу его найти. Даже если бы у меня был DbContext, я не могу запросить его для его модели. Я думал, что это будет в свойстве DbContext.Configuration
,но возвращенный DbContextConfiguration
не имеет полей для доступа к именамтаблицы и столбцы, как у ModelBuilder
.
Итак: как мне узнать фактические имена моих таблиц и столбцов в версии, которую я обновляю в этой DbMigration
?
Добавление после комментариев
Стив Грин предложил позволить Entity Framework DbMigration обнаруживать, что модель изменилась.Для тех, кто заинтересован, этот метод известен как Автоматическая миграция .
Однако, если вы хотите получить полный контроль над вашими таблицами / столбцами и отношениями между таблицами, вам нужно будет сделать миграции на основе кода (миграции с использованием DbMigrations.Up () и DbMigrations.Down ().
Если во время создания базы данных с первым кодом вам не нужны соглашения о присвоении имен по умолчанию длятаблицы и столбцы, если вы не хотите использовать длину строки по умолчанию, точность по умолчанию для десятичных чисел и т. д., вам придется использовать свободный API (или атрибуты).
Аналогично, если вы не хотите, чтобы объектпо умолчанию, во время миграции вам придется писать код в DbMigrations.Up()
и Down()
.
Для простоты моего примера я использовал класс Country
, который по умолчанию привел бы к таблице Countrys
Но можно подумать о более сложных элементах, таких как максимальная длина поля свойства строки, точность десятичных чисел, равная CascadeOnDelete