Genera índices de tablas usando Fluente NHibernate
fluent nhibernate mapping (3)
¿Es posible generar índices de tablas junto con el resto del esquema de base de datos con Fluent NHibernate? Me gustaría poder generar la base de datos DDL completa a través de un proceso de compilación automatizado.
¿Te refieres a los índices en las columnas?
Puede hacerlo manualmente en sus ClassMap<...>
agregando .SetAttribute("index", "nameOfMyIndex")
, por ejemplo, así:
Map(c => c.FirstName).SetAttribute("index", "idx__firstname");
o puede hacerlo utilizando las características de atributo del automapper, por ejemplo, así:
Después de haber creado tu modelo de persistencia:
{
var model = new AutoPersistenceModel
{
(...)
}
model.Conventions.ForAttribute<IndexedAttribute>(ApplyIndex);
}
void ApplyIndex(IndexedAttribute attr, IProperty info)
{
info.SetAttribute("index", "idx__" + info.Property.Name");
}
y luego haz esto a tus entidades:
[Indexed]
public virtual string FirstName { get; set; }
Me gusta lo último. Es un buen compromiso entre no ser no intrusivo para su modelo de dominio y, al mismo tiempo, ser muy efectivo y claro sobre lo que está sucediendo.
La respuesta de Mookid es excelente y me ayudó mucho, pero mientras tanto la API Fluent NHibernate en constante evolución ha cambiado.
Por lo tanto, la forma correcta de escribir una muestra de mookid ahora es la siguiente:
//...
model.ConventionDiscovery.Setup(s =>
{
s.Add<IndexedPropertyConvention>();
//other conventions to add...
});
donde IndexedPropertyConvention es el siguiente:
public class IndexedPropertyConvention : AttributePropertyConvention<IndexedAttribute>
{
protected override void Apply(IndexedAttribute attribute, IProperty target)
{
target.SetAttribute("index", "idx__" + target.Property.Name);
}
}
El atributo [Indexado] funciona de la misma manera ahora.
En versiones más recientes de Fluent NHibernate, puede llamar al método Index()
para hacer esto en lugar de usar SetAttribute
(que ya no existe):
Map(x => x.Prop1).Index("idx__Prop1");