Domanda

È possibile generare indici di tabella insieme al resto dello schema del database con Fluent NHibernate? Vorrei essere in grado di generare il database DDL completo tramite un processo di generazione automatizzato.

È stato utile?

Soluzione

Nelle versioni più recenti di Fluente NHibernate, è possibile chiamare il metodo Index() per farlo anziché utilizzare SetAttribute (che non esiste più):

Map(x => x.Prop1).Index("idx__Prop1");

Altri suggerimenti

Intendi indici su colonne?

Puoi farlo manualmente nei tuoi ClassMap<...> file aggiungendo .SetAttribute("index", "nameOfMyIndex"), ad es. in questo modo:

Map(c => c.FirstName).SetAttribute("index", "idx__firstname");

oppure puoi farlo utilizzando le funzionalità degli attributi dell'automapper, ad es. in questo modo:

Dopo aver creato il modello di persistenza:

{
    var model = new AutoPersistenceModel
    {
        (...)
    }

    model.Conventions.ForAttribute<IndexedAttribute>(ApplyIndex);
}


void ApplyIndex(IndexedAttribute attr, IProperty info)
{
    info.SetAttribute("index", "idx__" + info.Property.Name");
}

e quindi fai ciò alle tue entità:

[Indexed]
public virtual string FirstName { get; set; }

Mi piace il secondo. È un buon compromesso tra il non essere non istruttivo sul tuo modello di dominio, ma essere comunque molto efficace e chiaro su ciò che sta accadendo.

La risposta di Mookid è eccezionale e mi ha aiutato molto, ma nel frattempo l'API NHibernate Fluent in continua evoluzione è cambiata.

Quindi, il modo giusto per scrivere un esempio mookid ora è il seguente:

//...
model.ConventionDiscovery.Setup(s =>
            {
                s.Add<IndexedPropertyConvention>();
                //other conventions to add...
            });

dove IndexedPropertyConvention è il seguente:

public class IndexedPropertyConvention : AttributePropertyConvention<IndexedAttribute>  
{
    protected override void Apply(IndexedAttribute attribute, IProperty target)
    {
         target.SetAttribute("index", "idx__" + target.Property.Name);
    }
}

L'attributo [Indexed] ora funziona allo stesso modo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top