Fluent nHibernate:为多个外键创建索引,为一个外键创建另一个索引

Fluent nHibernate:为多个外键创建索引,为一个外键创建另一个索引,nhibernate,fluent-nhibernate,nhibernate-mapping,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,我有一张桌子叫“TableA”。此表中有两列(外键),分别称为“ColA”和“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 nHi

我有一张桌子叫“TableA”。此表中有两列(外键),分别称为“ColA”和“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-类型为
自动映射

ColA/ColBExpression-类型为
Expression

现在,如果我尝试为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>
问题是索引被覆盖而不是连接,我得到了如下映射:

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>

我使用了
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();
流利
.Configure(配置)
.映射(
m=>
m、 FluentMappings
.AddFromAssemblyOf()的
.Conventions.Add(PrimaryKey.Name.Is(x=>“Id”)、DefaultLazy.Always()、ForeignKey.EndsWith(“Id”))
.Conventions.Add(新的ForeignKeyConvention()))
.曝光配置(
配置=>
{
装配
.getExecutionGassembly()
.GetTypes()
.Where(t=>typeof(AbstractAuxiliaryDatabaseObject).IsAssignableFrom(t))
.ForEach(t=>config.AddAuxiliaryDatabaseObject(Activator.CreateInstance(t)作为IAuxiliaryDatabaseObject));
})
.BuildSessionFactory();
您可以通过
辅助DatabaseObject
添加额外的索引