2016-03-02 6 views
1

Я ищу способ, чтобы написать метод расширения для беглой проверки Migrator перед тем создать таблицу, что-то вроде этогоПроверка Таблица Exist Перед Создание таблицы На FluentMigrator

Schema.TableIfNotExist("table").InSchema("dbo").WithColumn("Id").AsInt32().NotNullable() 

является возможность написать метод расширения?

+0

Вы пробовали с помощью поймать блок попробовать? Или оберните таблицу create как метод расширения, используя блок catch try внутри метода. –

ответ

2

Да, вы можете

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; 
    } 
} 

Вы собираетесь иметь два предостережений (что я знаю):

  1. При вызове функции в той же самой миграции более чем один раз, первый будет , остальные будут терпеть неудачу, поскольку проверка наличия требует, чтобы контекст схемы обновлялся новыми таблицами, которые не происходит до следующей миграции (или до тех пор, пока не будет успешно выполнен текущий перенос).
  2. Если вы используете AutoReversingMigrations, выражение не будет , автоматически сопоставленное с его соответствующими ответами. Значение означает, что неявный эффект не будет иметь никакого эффекта.

Чтобы использовать палец выше расширения и ваш пример, вы могли бы сделать

public override void Up() 
{ 
    this.CreateTableIfNotExists("table", table => table.WithColumn("Id").AsInt32().NotNullable()); 
} 
+0

Это также работает для столбцов. Вы можете определить функцию как таковую: public static IFluentSyntax CreateColumnIfNotExists (это MigrationBase self, строка таблицы, колонка строки, Func columnCreator, строка schema = "dbo") ', а затем использовать его следующим образом:' this. CreateColumnIfNotExists («Foo», «Bar», column => column.OnTable («Foo»). AsDecimal()); '. Может быть лучший способ сделать это, что не предполагает дублирования объявления таблицы, но я не мог понять это. –

+1

@MorganThrapp Вы бы сделать что-то вроде этого, может быть: 'общественный статический IFluentSyntax CreateColIfNotExists (это само MigrationBase, строка TABLENAME, строка ColName, Func constructColFunction, строка SchemaName = "ДБО") { если (самостоятельно!. Schema.Schema (schemaName) .Table (tableName) .Column (colName) .Exists()) { return constructColFunction (self.Alter.Table (tableName) .AddColumn (colName)); } прочее null null; } ' – Tarek

+1

Затем вызовите его так:' this.CreateColIfNotExists («Таблица», «Col», col => col.AsInt32(). Nullable(). Indexed()); ' – Tarek