quinta-feira, 20 de outubro de 2016

Entity Framework Discriminator Index

I create a nuget package with a Entity Framework convention that allow us to create indexes on discriminator columns.

Nuget Package: https://www.nuget.org/packages/EntityFramework.DiscriminatorIndex/
GitHub: https://github.com/marcusmiris/EntityFramework.DiscriminatorIndex

Setup

Migration Configuration file:

internal sealed class Configuration : DbMigrationsConfiguration
{
    public Configuration()
    {
        this.AddSupportToDiscriminatorIndex();
    }
}

DbConfiguration:

public class DbConfiguration : System.Data.Entity.DbConfiguration
{
    public DbConfiguration()
    {
        SetMetadataAnnotationSerializer(
            DiscriminatorIndexAnnotation.AnnotationName,
            () => new DiscriminatorIndexAnnotationSerializer());
    }
}

How To Use?

Entity Type Configuration

To configure a Discriminator index on an entity, we can use the extention method HasIndexOnDiscriminator() of the EntityTypeConfiguration:

public class DbContext: System.Data.Entity.DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity().HasIndexOnDiscriminator();
        base.OnModelCreating(modelBuilder);
    }
}

Optionally, we can customize the column name, or also set the index name.

modelBuilder.Entity().HasIndexOnDiscriminator(
    columnName: "MyDiscriminator", 
    indexName: "IX_Entity_Discriminator");

Convention

Using the convention, all columns named as "Discriminator" in the database will be indexed.

public class DbContext: System.Data.Entity.DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Add();
        base.OnModelCreating(modelBuilder);
    }
}

Optionally, we can provide an alternative column name to search for:

modelBuilder.Conventions.Add(new DiscriminatorIndexConvention(
    discriminatorColumnName: "CustoDiscriminator"));

When using the convention, we can also ignore some entity:



modelBuilder.Entity()
    .HasTableAnnotation(DiscriminatorIndexAnnotation.AnnotationName, null);

... or yet replace the default convention using the HasIndexOnDiscriminator extension method.

Nenhum comentário: