Entity Framework Migrations: получить имя таблицы и столбца - PullRequest
0 голосов
/ 24 сентября 2018

В 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

...