Question

Is it possible to generate table indexes along with the rest of the database schema with Fluent NHibernate? I would like to be able to generate the complete database DDL via an automated build process.

Was it helpful?

Solution

In more recent versions of Fluent NHibernate, you can call the Index() method to do this rather than using SetAttribute (which no longer exists):

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

OTHER TIPS

Do you mean indexes on columns?

You can do it manually in your ClassMap<...> files by appending .SetAttribute("index", "nameOfMyIndex"), e.g. like so:

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

or you can do it by using the attribute features of the automapper - e.g. like so:

After having created your persistence model:

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

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


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

and then do this to your entities:

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

I like the latter. Is is a good compromise between not being non-instrusive to your domain model, yet still being very effective and clear on what is happening.

Mookid's answer is great and helped me a lot, but meanwhile the ever evolving Fluent NHibernate API has changed.

So, the right way to write mookid sample now is the following:

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

where IndexedPropertyConvention is the following:

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

The [Indexed] attribute works the same way now.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top