流畅的nHibernate:为多个外键创建索引,为另一个外键创建另一个外键

时间:2018-04-26 14:21:52

标签: nhibernate fluent-nhibernate nhibernate-mapping

我有一个名为" 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中为两列创建一个索引,我这样做:

TableA - 属于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 :(得分:0)

我使用df[df['val']!=''].groupby('g').val.count().median() 的衍生物

完成了这种事情
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(); 添加额外的索引。