When we have composite primary keys, we need to give them an order.
In some cases, you may need to have composite primary keys, that is, have a primary key that is composed of not a single column, but many. This is certainly a valid requirement, but, unless you configure it properly, Entity Framework will not work. And something that does not work is mapping attributes:
using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; public class MyClassWithCompositeKey { [Key] [Column(Order = 0)] public int KeyA { get; set; } [Key] [Column(Order = 1)] public string KeyB { get; set; } [Key] [Column(Order = 2)] public Guid KeyC { get; set; } }
Again, the preceding code will not work; it will be totally ignored by Entity Framework.
You need to mark all of your properties that make up the primary key with an order number; each will have its own, and you need to use fluent mapping for this:
protected override void OnModelCreating( DbModelBuilder modelBuilder) { //set keys for MyClassWithCompositeKey in order modelBuilder .Entity<MyClassWithCompositeKey>() .HasKey("KeyA", "KeyB", "KeyC"); base.OnModelCreating(modelBuilder); }
This is, sadly, another shortcoming of Entity Framework Core 1 that we expect to see fixed in a future release.