I have a table (Id, name, itemst, otherproperties), Id is the primary key and I want a unique composite key (name, itemst). How can I add this using code first either by fluent API (preferred) or annotation?
Asked
Active
Viewed 2.2k times
2 Answers
23
Let say you have a entity named
public class MyTable
{
public int Id {get; set;}
public String Name {get; set;}
}
you can create composite key using
public class YourContext : DbContext
{
public DbSet<MyTable> MyTables { get; set; }
protected override void OnModelCreating(DbModelBuilder builder)
{
builder.Entity<MyTable>().HasKey(table => new {table.Id, table.Name});
}
}
if you prefer data annotation you can simple add KeyAttribute
to multiple properties
public class MyTable
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] // optional
[Key]
public int Id { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.None)] // optional
[Key]
public String Name { get; set; }
}

Parimal Raj
- 20,189
- 9
- 73
- 110
-
1Hey! I was about to answer that. – User 12345678 Jul 02 '14 at 05:06
-
@ByteBlast ahh! gr8 2 you here, part of ans still missing, adding unique via fluent api – Parimal Raj Jul 02 '14 at 05:09
16
Here is an example showing how to create a composite unique key via fluent API. The composite key consists of ProjectId and SectionOdKey.
public class Table
{
int Id{set;get;}
int ProjectId {set;get;}
string SectionOdKey{set;get;}
}
public class TableMap : EntityTypeConfiguration<Table>
{
this.Property(t => t.ProjectId).HasColumnName("ProjectId")
.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_ProjectSectionOd", 1){IsUnique = true}));
this.Property(t => t.SectionOdKey).HasColumnName("SectionOdKey")
.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_ProjectSectionOd", 2){IsUnique = true}));
}

Bargitta
- 2,266
- 4
- 22
- 35