Search code examples
c#ef-code-firstentity-framework-coreef-core-2.0

Is there a data annotation for unique constraint in EF Core (code first)?


I am wondering if there is a data annotation for unique constraint in Entity Framework Core 2 code first approach?


Solution

  • In EF Core you could use the extension method HasAlternateKey in fluent API only. There are no data annotations to realize a unique constraint.

    This MS doc article - Alternate Keys (Unique Constraints) - will explain how to use and which further possibilities are exist.

    A short example from link above:

    class MyContext : DbContext
    {
        public DbSet<Car> Cars { get; set; }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Car>()
                .HasAlternateKey(c => c.LicensePlate)
                .HasName("AlternateKey_LicensePlate");
        }
    }
    
    class Car
    {
        public int CarId { get; set; }
        public string LicensePlate { get; set; }
        public string Make { get; set; }
        public string Model { get; set; }
    }
    

    Also it's possible to define an unique index. Therefore, in EF Core you can use the fluent API's extension method HasIndex or the data annotation way with the attribute [Index].

    In this MS doc article - Indexes - you will find further information how to use.

    Here an example for an unique index with fluent API:

    class MyContext : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Blog>()
                .HasIndex(b => b.Url)
                .IsUnique();
        }
    }
    
    public class Blog
    {
        public int BlogId { get; set; }
        public string Url { get; set; }
    }
    

    Here the same example, but with data annotation:

    [Index(nameof(Url), IsUnique = true)]
    public class Blog
    {
        public int BlogId { get; set; }
        public string Url { get; set; }
    }
    

    Update 2021-09-10

    • added additional info how to use with data annotation, because it's now available in EF Core;

    Update 2021-09-24

    • fixed missing IsUnique property in attribute example