Я запускаю новый проект, который использует Entity Framework. Я изучил мои варианты создания базы данных и нашел, что Code-First Migrations наиболее удобны (см. Ниже, если вам нужно знать, почему). Code-First Migrations позволяет мне опуститься до произвольного SQL, что я все еще имею полный контроль. На практике я обнаружил, что проблема заключается в том, что отказ от SQL кажется чересчур повторяющимся для некоторых общих задач.
В моих целях мне все равно, что расширения в миграции не являются агностиками-провайдерами (SQL-я не подстраиваюсь). Тем не менее, я действительно не нахожу хороший шов или точку расширения в структуре миграции для добавления таких вещей.
Чтобы дать конкретный пример, предположим, что я хочу указать столбец RowGuid для репликации MS-SQL. Каждое событие имеет вид
Sql(
string.Format(
"Alter Table {0} Alter Column {1} Add ROWGUIDCOL",
table,
column ));
Итак, я пишу статические методы, чтобы избавиться от некоторой избыточности
Sql( MigrationHelper.SetRowGuid( table, column );
-или -
MigrationHelper.SetRowGuid(Sql, table, column); //passing the Sql method
Возможно, можно сделать любой из этих методов расширения в DbMigration и получить к ним доступ через this.
Но все же это выглядит неуместно:
CreateTable(
"dbo.CustomerDirectory",
c => new
{
Uid = c.Int(nullable: false),
CustomerUid = c.Int(nullable: false),
Description = c.String(nullable: false, maxLength: 50, unicode: false),
RowGuid = c.Guid(nullable: false),
})
.PrimaryKey(t => t.Uid)
.ForeignKey("dbo.Customer", t => t.CustomerUid);
this.SetRowGuid( Sql, "dbo.CustomerDirectory", "RowGuid" );
//Custom method here because of desired naming convention of Constraint
this.SetDefaultConstraint( Sql, "dbo.CustomerDirectory", "''" ):
Это не страшно, но мне все равно кажется, что он взломан. Я должен повторить имя таблицы, и мне нужно убедиться, что я правильно создал имя сгенерированного столбца. Я считаю, что имя таблицы нужно повторять много, но так же и столбцы. Тем не менее, что я действительно пытаюсь сделать, как добавить в объявление таблицы, которое произошло только там, где были известны все имена таблиц и столбцов.
Я, однако, не смог найти хорошую точку расширения для расширения свободного интерфейса или иным образом продлить первые миграции кода таким образом, чтобы он выглядел последовательным. Я что-то упускаю? Кто-нибудь нашел хороший способ сделать это?
Некоторые обоснования того, почему я в этой ситуации:
Мне не понравилось то, что казалось общим решением использования общего решения для настраиваемых атрибутов, чтобы указать базу данных, не относящуюся к карте, по нескольким причинам, но наиболее сильно, потому что они автоматически не подхватываются миграциями, что означает дополнительное обслуживание. Первоначальные решения были исключены из-за того, что они не дают полного контроля над базой данных. База данных - первая была привлекательной из-за контроля; однако в нем нет встроенных функций управления изменениями, предоставляемых Code-First Migrations. Таким образом, Code-First Migrations, по-видимому, был победителем, потому что изменения в моделях с кодовым управлением были автоматическими, и это означало, что поддерживать только одну вещь.