如何使用fluent-nhibernate更改多列索引中的列顺序?

如何更改多列索引中的列顺序?
即:

mapping.References(x => x.SomeReference).SetAttribute("index", "IX_index");
mapping.Map(x => x.SomeField).SetAttribute("index", "IX_index");

生成以下架构:

create index IX_index on ApplicantProgramDatas (SomeField, SomeReferenceId)

但我想得到:

create index IX_index on ApplicantProgramDatas (SomeReferenceId, SomeField)
您可以使用< database-object>在NHibernate中定义索引.或IAuxiliaryDatabaseObject.

在hbm.xml文件中:

<hibernate-mapping xmlns="urn:nhiernate-mapping-2.2">
  <database-object>
     <create>VALID SQL</create>
     <drop>VALID SQL</create>
  </database-object>
</hibernate-mapping>

注: <数据库对象>可以在同一个hbm.xml文件中的类映射之前或之后进行,允许您将索引定义,触发器等保留在它们应用的对象中.

另一个选项是NHibernate.Mapping.IAuxiliaryDatabaseObject:

namespace NHibernate.Mapping {
    public interface IAuxiliaryDatabaseObject : IRelationalModel {
        void AddDialectScope(string dialectName);
        bool AppliesToDialect(Dialect dialect);
        void SetParameterValues(IDictionary<string, string> parameters);
    }
    public interface IRelationalModel {
        string SqlCreateString(Dialect dialect, IMapping p, string defaultCatalog, string defaultSchema);
        string SqlDropString(Dialect dialect, string defaultCatalog, string defaultSchema);
    }
}

鉴于您正在使用Fluent NHibernate,IAuxiliaryDatabaseObject可能会更适合您.只需在构建时公开配置,然后调用:

var sqlCreate = "CREATION SCRIPT";
var sqlDrop = "DROP SCRIPT";    
cfg.AddAuxiliaryDatabaseObject(new SimpleAuxiliaryDatabaseObject(sqlCreate, sqlDrop));

注: NHibernate.Mapping.SimpleAuxiliaryDatabaseObject是NHibernate的一部分.如果您只需要为数据库对象提供创建/删除脚本,则无需自己编写.

我快速浏览了Fluent NHibernate代码库,但没有看到对IAuxiliaryDatabaseObject的任何直接支持.所以这是暴露配置对象并自己提供所有IAuxiliaryDatabaseObjects的问题.编写一些代码来扫描您的映射程序集,寻找实现IAuxiliaryDatabaseObject的类型,然后对它们进行预处理以传递给cfg.AddAuxiliaryDatabaseObject(obj),这不会太困难.

您可以在NHibernate文档中找到有关辅助数据库对象的更多信息:

http://nhibernate.info/doc/nh/en/index.html#mapping-database-object

本站公众号
   欢迎关注本站公众号,获取更多程序园信息
开发小院