Ist es möglich, Tabellenindizes zusammen mit dem Rest des Datenbankschemas mit Fluent NHibernate zu generieren? Ich möchte in der Lage sein, die komplette Datenbank DDL über einen automatisierten Build-Prozess zu generieren.Tabellenindizes mit Fluent NHibernate generieren
Antwort
In neueren Versionen von Fluent NHibernate, können Sie die Index()
Methode nennen dies eher zu tun, als SetAttribute
verwenden (was nicht mehr existiert):
Map(x => x.Prop1).Index("idx__Prop1");
Meinst du Indizes auf Spalten?
Sie können es manuell in Ihren ClassMap<...>
Dateien tun, indem Sie .SetAttribute("index", "nameOfMyIndex")
, z. etwa so:
Map(c => c.FirstName).SetAttribute("index", "idx__firstname");
oder Sie können es tun, um die Attribute Eigenschaften des AutoMapper durch die Verwendung - z.B. so wie:
nach dem Persistenz-Modell erstellt haben:
{
var model = new AutoPersistenceModel
{
(...)
}
model.Conventions.ForAttribute<IndexedAttribute>(ApplyIndex);
}
void ApplyIndex(IndexedAttribute attr, IProperty info)
{
info.SetAttribute("index", "idx__" + info.Property.Name");
}
und dann tun dies, um Ihre Einheiten:
[Indexed]
public virtual string FirstName { get; set; }
ich das letztere mögen. Es ist ein guter Kompromiss zwischen nicht aufdringlich zu Ihrem Domain-Modell, aber immer noch sehr effektiv und klar, was passiert.
Das ist genau das, was ich suchte. Vielen Dank. –
Mookids Antwort ist großartig und hat mir sehr geholfen, aber inzwischen hat sich die ständig weiterentwickelte Fluent NHibernate API geändert.
also der richtige Weg mookid Probe jetzt zu schreiben, ist die folgende:
//...
model.ConventionDiscovery.Setup(s =>
{
s.Add<IndexedPropertyConvention>();
//other conventions to add...
});
wo IndexedPropertyConvention ist die folgende:
public class IndexedPropertyConvention : AttributePropertyConvention<IndexedAttribute>
{
protected override void Apply(IndexedAttribute attribute, IProperty target)
{
target.SetAttribute("index", "idx__" + target.Property.Name);
}
}
Das [Indiziert] Attribut funktioniert nun die gleiche Weise.
Korrekt, die API wurde geändert und dies wird jetzt als die richtige Methode zum Festlegen von Indizes angesehen. Ich habe die Antwort zu dieser Frage aktualisiert, um diese Änderung widerzuspiegeln. Vielen Dank. –