Свободный nHibernate: создать индекс для нескольких внешних ключей и другой для одного внешнего ключа - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть таблица под названием «TableA». В этой таблице есть два столбца (внешние ключи), которые называются «ColA» и «ColB». Я хочу создать два индекса. Один для ColA и ColB, а другой только для ColB. В SQL это можно сделать следующим образом:

CREATE NONCLUSTERED INDEX [IX_TableA_ColA_ColB] ON TableA
(
ColA ASC,
ColB ASC
)
CREATE NONCLUSTERED INDEX [IX_TableA_ColB] ON TableA
(
ColB ASC
)

В Fluent nHibernate для создания одного индекса для двух столбцов я делаю это так:

Таблица A - относится к типу AutoMapping

ColA / ColBExpression - относится к типу Expression<Func<T, TRef>>

TableA.References(ColAExpression).Index(indexName);
TableA.References(ColBExpression).Index(indexName);

Теперь, если я пытаюсь установить другой индекс для ColB, я пытаюсь сделать это так:

TableA.References(ColBExpression).Index(otherIndexName);

Проблема в том, что индекс перезаписывается, а не соединяется, и я получаю сопоставление, подобное этому:

<many-to-one class="ColB, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" foreign-key="Fk_TableA_TableB_ColB" name="ColB">
  <column name="ColBId" index="IX_TableA_ColB" />
</many-to-one>

Есть ли способ использовать Fluent nHibernate для создания сопоставления, как показано ниже?

<many-to-one class="ColB, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" foreign-key="Fk_TableA_TableB_ColB" name="ColB">
  <column name="ColBId" index="IX_TableA_ColB, IX_TableA_ColA_ColB" />
</many-to-one>

1 Ответ

0 голосов
/ 26 апреля 2018

Я делал подобные вещи, используя производные от AbstractAuxiliaryDatabaseObject:

public class SetIdDefaultsAuxiliaryDatabaseObject : AbstractAuxiliaryDatabaseObject
{
    public override string SqlCreateString(
        Dialect dialect,
        IMapping p,
        string defaultCatalog,
        string defaultSchema)
    {
        return
            $"ALTER TABLE {nameof(Customer)} ADD DEFAULT NEXT VALUE FOR SQ_{nameof(Customer)} FOR {nameof(Customer)}Id;"
    }

    public override string SqlDropString(
        Dialect dialect,
        string defaultCatalog,
        string defaultSchema)
        {
            return string.Empty;
        }
 }

... а затем связать их с моим SessionFactory созданием:

Fluently
    .Configure(Config)
    .Mappings(
        m => 
            m.FluentMappings
                .AddFromAssemblyOf<CustomerMap>()
                .Conventions.Add(PrimaryKey.Name.Is(x => "Id"), DefaultLazy.Always(), ForeignKey.EndsWith("Id"))
                .Conventions.Add(new ForeignKeyConvention()))
    .ExposeConfiguration(
        config =>
        {
            Assembly
               .GetExecutingAssembly()
               .GetTypes()
               .Where(t => typeof(AbstractAuxiliaryDatabaseObject).IsAssignableFrom(t))
               .ForEach(t => config.AddAuxiliaryDatabaseObject(Activator.CreateInstance(t) as IAuxiliaryDatabaseObject));
        })
    .BuildSessionFactory();

Вы можете добавить свой дополнительный индекс через AuxiliaryDatabaseObject.

...