Fluent nHibernate:为多个外键创建索引,为一个外键创建另一个索引
我有一张桌子叫“TableA”。此表中有两列(外键),分别称为“ColA”和“ColB”。我想创建两个索引。一个是可乐和可乐,另一个只是可乐。 在SQL中,这可以通过以下方式完成: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
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
添加额外的索引