Да, вы можете
public static class Ex
{
public static IFluentSyntax CreateTableIfNotExists(this MigrationBase self, string tableName, Func<ICreateTableWithColumnOrSchemaOrDescriptionSyntax, IFluentSyntax> constructTableFunction, string schemaName = "dbo")
{
if (!self.Schema.Schema(schemaName).Table(tableName).Exists())
{
return constructTableFunction(self.Create.Table(tableName));
}
else
return null;
}
}
Вы собираетесь иметь два предостережений (что я знаю):
- При вызове функции в той же самой миграции более чем один раз, первый будет , остальные будут терпеть неудачу, поскольку проверка наличия требует, чтобы контекст схемы обновлялся новыми таблицами, которые не происходит до следующей миграции (или до тех пор, пока не будет успешно выполнен текущий перенос).
- Если вы используете AutoReversingMigrations, выражение не будет , автоматически сопоставленное с его соответствующими ответами. Значение означает, что неявный эффект не будет иметь никакого эффекта.
Чтобы использовать палец выше расширения и ваш пример, вы могли бы сделать
public override void Up()
{
this.CreateTableIfNotExists("table", table => table.WithColumn("Id").AsInt32().NotNullable());
}
Вы пробовали с помощью поймать блок попробовать? Или оберните таблицу create как метод расширения, используя блок catch try внутри метода. –