Można zdefiniować indeks w NHibernate przy użyciu < bazy obiekt > lub IAuxiliaryDatabaseObject.
W pliku hbm.xml:
<hibernate-mapping xmlns="urn:nhiernate-mapping-2.2">
<database-object>
<create>VALID SQL</create>
<drop>VALID SQL</create>
</database-object>
</hibernate-mapping>
nb < obiekt bazy danych > może przejść przed lub po odwzorowaniu klasy w tym samym pliku hbm.xml, co pozwala zachować definicje indeksu, wyzwalacze itp. Z obiektem, do którego się odnoszą.
Inną opcją jest 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);
}
}
Zważywszy, że używasz Fluent NHibernate, IAuxiliaryDatabaseObject prawdopodobnie będzie działać lepiej dla Ciebie. Po prostu ujawnij swoją konfigurację podczas budowania, a następnie zadzwoń:
var sqlCreate = "CREATION SCRIPT";
var sqlDrop = "DROP SCRIPT";
cfg.AddAuxiliaryDatabaseObject(new SimpleAuxiliaryDatabaseObject(sqlCreate, sqlDrop));
N.B. NHibernate.Mapping.SimpleAuxiliaryDatabaseObject jest częścią NHibernate. Nie musisz pisać sam, jeśli wszystko, co musisz zrobić, to dostarczyć skrypty create/drop dla obiektu bazy danych.
Szybko rzuciłem okiem na bazę Fluent NHibernate i nie widziałem żadnej bezpośredniej obsługi dla IAuxiliaryDatabaseObject. Jest to więc kwestia ujawnienia obiektu konfiguracyjnego i samodzielnego dostarczania wszystkich obiektów IAuxiliaryDatabaseObjects. Nie byłoby zbyt trudno napisać kod, który skanuje twój zestaw mapujący, szukając typów, które implementują IAuxiliaryDatabaseObject, a następnie przeszukując je, aby przejść do cfg.AddAuxiliaryDatabaseObject (obj).
można znaleźć więcej informacji na temat pomocniczych obiektów bazy danych w NHibernate docs:
http://nhibernate.info/doc/nh/en/index.html#mapping-database-object
+1 znalazłaś sposób, aby zrobić to w końcu?Mam ten sam problem. – Groo
Czy próbowałeś zamieniać kolejność deklaracji mapowania? (trochę krówki, nawet jeśli to działa!) – UpTheCreek
@UpTheCreek: Ben powiedział poniżej, myślę, że to nie działa. A to podejście i tak by się nie powiodło, gdybym miał więcej niż jeden indeks wielokolumnowy, ponieważ zmusiłby on kolumnę, by była najwyższą kolumną indeksu w indeksach * all *. – Groo