Search code examples
c#entity-frameworkentity-framework-6ef-fluent-api

Setting unique Constraint with fluent API?


I'm trying to build an EF Entity with Code First, and an EntityTypeConfiguration using fluent API. creating primary keys is easy but not so with a Unique Constraint. I was seeing old posts that suggested executing native SQL commands for this, but that seem to defeat the purpose. is this possible with EF6?


Solution

  • As of EF6.2, you can use HasIndex() to add indexes for migration through fluent API.

    https://github.com/aspnet/EntityFramework6/issues/274

    Example

    modelBuilder
        .Entity<User>()
        .HasIndex(u => u.Email)
            .IsUnique();
    

    As of EF6.1 onwards, you can use IndexAnnotation() to add indexes for migration in your fluent API.

    http://msdn.microsoft.com/en-us/data/jj591617.aspx#PropertyIndex

    You must add reference to:

    using System.Data.Entity.Infrastructure.Annotations;
    

    Basic Example

    Here is a simple usage, adding an index on the User.FirstName property

    modelBuilder 
        .Entity<User>() 
        .Property(t => t.FirstName) 
        .HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute()));
    

    Real World Example:

    Here is a more realistic example. It adds a unique index on multiple properties: User.FirstName and User.LastName, with the same index name IX_FirstNameLastName

    modelBuilder 
        .Entity<User>() 
        .Property(t => t.FirstName) 
        .IsRequired()
        .HasMaxLength(60)
        .HasColumnAnnotation(
            IndexAnnotation.AnnotationName, 
            new IndexAnnotation(
                new IndexAttribute("IX_FirstNameLastName", 1) { IsUnique = true }));
    
    modelBuilder 
        .Entity<User>() 
        .Property(t => t.LastName) 
        .IsRequired()
        .HasMaxLength(60)
        .HasColumnAnnotation(
            IndexAnnotation.AnnotationName, 
            new IndexAnnotation(
                new IndexAttribute("IX_FirstNameLastName", 2) { IsUnique = true }));