Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Composite Key with EF 4.1 Code First

I am trying to figure out how to have a composite key using EF code First 4.1 RC.

Currently, I am using the [Key] Data Annotation, but I am unable to specify more than one key.

how would one specify a composite key?

Here is my Example:

 public class ActivityType {     [Key]     public int ActivityID { get; set; }      [Required(ErrorMessage = "A ActivityName is required")]     [StringLength(50, ErrorMessage = "Activity Name must not exceed 50 characters")]     public string ActivityName { get; set; }  } 

I need the "ActivityName" to also be a key. Sure, I can code around this, but thats not good database design.

like image 204
bugnuker Avatar asked Mar 28 '11 23:03

bugnuker


2 Answers

You can mark both ActivityID and ActivityName properties with Key annotation or you can use fluent API as described by @taylonr.

Edit:

This should work - composite key defined with annotations requires explicit column order:

public class ActivityType {     [Key, Column(Order = 0)]     public int ActivityID { get; set; }      [Key, Column(Order = 1)]     [Required(ErrorMessage = "A ActivityName is required")]     [StringLength(50, ErrorMessage = "Activity Name must not exceed 50 characters")]     public string ActivityName { get; set; }  } 
like image 91
Ladislav Mrnka Avatar answered Sep 20 '22 06:09

Ladislav Mrnka


We don't use the annotations, instead we override the model builder, in which case you can do something like:

modelBuilder.Entity<Activity>().HasKey(a => new { a.ActivityId, a.ActivityName }); 
like image 31
taylonr Avatar answered Sep 18 '22 06:09

taylonr