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

Boz*_*zak 6 fluent-nhibernate

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

mapping.References(x => x.SomeReference).SetAttribute("index", "IX_index");
mapping.Map(x => x.SomeField).SetAttribute("index", "IX_index");
Run Code Online (Sandbox Code Playgroud)

生成以下架构:

create index IX_index on ApplicantProgramDatas (SomeField, SomeReferenceId)
Run Code Online (Sandbox Code Playgroud)

但我想得到:

create index IX_index on ApplicantProgramDatas (SomeReferenceId, SomeField)
Run Code Online (Sandbox Code Playgroud)

Jam*_*acs 4

您可以使用 <database-object> 或 IAuxiliaryDatabaseObject 在 NHibernate 中定义索引。

在 hbm.xml 文件中:

<hibernate-mapping xmlns="urn:nhiernate-mapping-2.2">
  <database-object>
     <create>VALID SQL</create>
     <drop>VALID SQL</create>
  </database-object>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)

注意 <database-object> 可以位于同一 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

var sqlCreate = "CREATION SCRIPT";
var sqlDrop = "DROP SCRIPT";    
cfg.AddAuxiliaryDatabaseObject(new SimpleAuxiliaryDatabaseObject(sqlCreate, sqlDrop));
Run Code Online (Sandbox Code Playgroud)

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

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

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

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