【问题标题】:Fluent nHibernate: Create Index for multiple foreignkeys and another for one single foreign keyFluent nHibernate:为多个外键创建索引,为一个外键创建另一个索引
【发布时间】:2018-04-26 22:53:26
【问题描述】:

我有一个名为“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>

【问题讨论】:

    标签: nhibernate fluent-nhibernate nhibernate-mapping


    【解决方案1】:

    我已经使用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 添加额外的索引。

    【讨论】:

      猜你喜欢
      • 2017-04-27
      • 2021-05-23
      • 1970-01-01
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-03
      • 2018-04-22
      相关资源
      最近更新 更多