So erstellen Sie einen mehrspaltigen Index und/oder eine eindeutige Einschränkung mithilfe von NHibernate Mapping oder Fluent NHibernate.So erstellen Sie einen mehrspaltigen Index oder eine eindeutige Einschränkung mit NHibernate
Antwort
zuordnen Index/eindeutige Einschränkung Namen mehr als eine Eigenschaft
<property name="A" index="AB" />
<property name="B" index="AB" />
Theoretische es auch mit, die mehr als einen Index auf der gleichen Einheit funktionieren würde:
<property name="A" index="AB, ABC" />
<property name="B" index="AB, ABC" />
<property name="C" index="ABC" />
But there is a bug. Ich habe auch einen Patch geschrieben. Wenn Sie daran interessiert sind, stimmen Sie bitte für den Fehler oder fügen Sie einen Kommentar oder etwas hinzu.
Bearbeiten: nur überprüft, was mit the bug passiert ist. Es ist in Version 2.1.0 behoben, also sollte es jetzt perfekt funktionieren. Vielen Dank an das großartige Entwicklerteam von NHibernate!
Alt, aber ich habe etwas hinzufügen, da ich auf diese gleiche Frage kam:
Stefan Steinegger richtig beantwortete für nicht -einzigartige Indizes mit mehreren Spalten, aber für den Code links aus einzigartigen mehrspaltigen Indizes. Für diejenigen, die Sie verwenden können:
Also, im Wesentlichen gleich, aber mit einem anderen Attributnamen.
Eine interessante Sache ist zu beachten, dass für eindeutigen Indizes, NHibernate für den Schlüssel eigene Namen erzeugt, aber für nicht eindeutigen Indizes verwendet es, was auch immer Sie es geben.
Zum Beispiel erzeugt der obige Code NICHT einen eindeutigen Index namens "AB", sondern etwas wie UQ__TableName__7944C87104A02EF4
.
Dies ist in section 19.1.1 der NHibernate Dokumentation dokumentiert:
Einige Tags ein
index
Attribut für die Angabe des Namens eines Index für diese Spalte übernehmen. Einunique-key
Attribut kann verwendet werden, um Spalten in einer einzelnen Einheit Schlüssel Einschränkung zu gruppieren. Derzeit ist der angegebene Wert des Attributs unique-key nicht, um die Einschränkung zu verwenden, nur zum Gruppieren der Spalten in der Zuordnungsdatei.
jedoch folgendes:
<property name="A" index="AB" />
<property name="B" index="AB" />
wird nur einen Index erzeugen namens "AB".
Für Fluent NHibernate müssen Sie SetAttribute verwenden, die es so etwas wie machen: Karte (x => x.A) .SetAttribute ("index", "AB"); –
Für alle, die sich fragen, unterstützt Fluent NHibernate nun '.Index (" IndexName ... ")', anstatt 'SetAttribute' zu verwenden. – Phill
Es ist wichtig zu sagen, dass die Eigenschaft 'index' (und auch 'eindeutiger Schlüssel') von NHibernate nur verwendet wird, wenn eine CREATE TABLE-Anweisung generiert wird und NHibernate nicht daran gehindert wird, eine doppelte Zeile einzufügen, wenn eine Sitzung verwendet wird. Speichern usw. – mayu