Vous pouvez définir un index dans la base de données en utilisant NHibernate objet < > ou IAuxiliaryDatabaseObject.
Dans un fichier hbm.xml:
<hibernate-mapping xmlns="urn:nhiernate-mapping-2.2">
<database-object>
<create>VALID SQL</create>
<drop>VALID SQL</create>
</database-object>
</hibernate-mapping>
N.B. < objet-base de données > peut aller avant ou après un mappage de classe dans le même fichier hbm.xml vous permettant de conserver vos définitions d'index, déclencheurs, etc. avec l'objet auquel ils s'appliquent.
L'autre option est 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);
}
}
Étant donné que vous utilisez Fluent NHibernate, IAuxiliaryDatabaseObject sera probablement mieux pour vous. Présentez simplement votre configuration lors de sa construction, puis appelez:
var sqlCreate = "CREATION SCRIPT";
var sqlDrop = "DROP SCRIPT";
cfg.AddAuxiliaryDatabaseObject(new SimpleAuxiliaryDatabaseObject(sqlCreate, sqlDrop));
N.B. NHibernate.Mapping.SimpleAuxiliaryDatabaseObject fait partie de NHibernate. Vous n'avez pas besoin de l'écrire vous-même si tout ce que vous avez à faire est de fournir des scripts de création/suppression pour un objet de base de données. J'ai jeté un rapide coup d'oeil dans la base de code Fluent NHibernate et n'ai vu aucun support direct pour IAuxiliaryDatabaseObject. Il s'agit donc d'exposer votre objet de configuration et de fournir vous-même tous vos IAuxiliaryDatabaseObjects. Il ne serait pas trop difficile d'écrire du code qui balaye l'ensemble de mappage en recherchant les types qui implémentent IAuxiliaryDatabaseObject, puis de les forcer à passer à cfg.AddAuxiliaryDatabaseObject (obj).
Vous pouvez trouver plus d'informations sur les objets de base de données auxiliaires dans les NHibernate docs:
http://nhibernate.info/doc/nh/en/index.html#mapping-database-object
+1 Avez-vous trouver un moyen de le faire par la suite?J'ai le même problème. – Groo
Avez-vous essayé d'échanger l'ordre des déclarations de mappage? (un peu de fudge, même si ça marche!) – UpTheCreek
@UpTheCreek: Comme Ben l'a dit plus bas, je pense que ça ne marche pas. Et l'approche échouerait de toute façon si j'avais plus d'un index multi-colonnes, car cela forcerait une seule colonne à être la colonne d'index la plus haute dans * tous * les index. – Groo