Могу ли я исключить определенные таблицы при построении схемы базы данных с использованием Castle ActiveRecord - PullRequest
0 голосов
/ 25 августа 2011

Мы используем Castle ActiveRecord в качестве вспомогательного слоя поверх NHibernate. Для создания нашей базы данных мы используем:

ActiveRecordStarter.CreateSchema();

Для генерации sql для построения нашей базы данных мы используем:

ActiveRecordStarter.GenerateCreationScripts(filename);

Они работают как шарм. Однако иногда мы не хотим создавать таблицу для каждого из наших объектов. Я считаю, что в nhibernate есть механизм исключения определенных таблиц из сборки схемы (см. здесь ) - кто-нибудь знает, может ли ActiveRecord сделать то же самое?

1 Ответ

0 голосов
/ 28 сентября 2011

Для потомков вот что я в итоге сделал:

1) Схватил исходный код NHibernate SchemaExporter и переименовал класс в «OurSchemaExporter».

2) Добавлен новый конструктор:

    public OurSchemaExporter(Configuration cfg, Func<string, bool> shouldScriptBeIncluded)
        : this(cfg, cfg.Properties)
    {
        this.shouldScriptBeIncluded = shouldScriptBeIncluded ?? (s => true);
    }

3) Изменен метод инициализации для вызова, чтобы выяснить, должен ли быть включен скрипт:

    private void Initialize()
    {
        if (this.wasInitialized)
            return;
        if (PropertiesHelper.GetString("hbm2ddl.keywords", this.configProperties, "not-defined").ToLowerInvariant() == Hbm2DDLKeyWords.AutoQuote)
            SchemaMetadataUpdater.QuoteTableAndColumns(this.cfg);
        this.dialect = Dialect.GetDialect(this.configProperties);
        this.dropSQL = this.cfg.GenerateDropSchemaScript(this.dialect);
        this.createSQL = this.cfg.GenerateSchemaCreationScript(this.dialect);

        // ** our modification to exclude certain scripts **
        this.dropSQL = new string[0]; // we handle the drops ourselves, as NH doesn't know the names of all our FKs
        this.createSQL = this.createSQL.Where(s => shouldScriptBeIncluded(s)).ToArray();

        this.formatter = (PropertiesHelper.GetBoolean("format_sql", this.configProperties, true) ? FormatStyle.Ddl : FormatStyle.None).Formatter;
        this.wasInitialized = true;
    }

4) При использовании OurSchemaExporter проверьте, хотим ли мы включить определенные таблицы, посмотрев содержимое каждого сценария создания SQL:

var ourSchemaExport = new TpsSchemaExporter(configuration, ShouldScriptBeIncluded);

...

private bool ShouldScriptBeIncluded(string script)
{
  return !tablesToSkip.Any(t => ShouldSkip(script, t));
}

private static bool ShouldSkip(string script, string tableName)
{
  string s = script.ToLower();
  string t = tableName.ToLower();
  return
    s.Contains(string.Format("create table dbo.{0} ", t))
    || s.Contains(string.Format("alter table dbo.{0} ", t))
    || s.EndsWith(string.Format("drop table dbo.{0}", t));
}

Взломать, но это делает работу.

...