chave composta como chave estrangeira

Estou usando o Entity Framework 4.1 no aplicativo MVC 3. Eu tenho uma entidade onde eu tenho chave primária consiste em duas colunas (chave composta). E isso está sendo usado em outra entidade como chave estrangeira. Como criar o relacionamento? Em scnerios normais usamos:

public class Category { public string CategoryId { get; set; } public string Name { get; set; } public virtual ICollection Products { get; set; } } public class Product { public int ProductId { get; set; } public string Name { get; set; } public string CategoryId { get; set; } public virtual Category Category { get; set; } } 

mas e se a categoria tiver duas colunas?

Você pode usar uma API fluente:

 public class Category { public int CategoryId1 { get; set; } public int CategoryId2 { get; set; } public string Name { get; set; } public virtual ICollection Products { get; set; } } public class Product { public int ProductId { get; set; } public string Name { get; set; } public int CategoryId1 { get; set; } public int CategoryId2 { get; set; } public virtual Category Category { get; set; } } public class Context : DbContext { public DbSet Categories { get; set; } public DbSet Products { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity() .HasKey(c => new {c.CategoryId1, c.CategoryId2}); modelBuilder.Entity() .HasRequired(p => p.Category) .WithMany(c => c.Products) .HasForeignKey(p => new {p.CategoryId1, p.CategoryId2}); } } 

Ou annotations de dados:

 public class Category { [Key, Column(Order = 0)] public int CategoryId2 { get; set; } [Key, Column(Order = 1)] public int CategoryId3 { get; set; } public string Name { get; set; } public virtual ICollection Products { get; set; } } public class Product { [Key] public int ProductId { get; set; } public string Name { get; set; } [ForeignKey("Category"), Column(Order = 0)] public int CategoryId2 { get; set; } [ForeignKey("Category"), Column(Order = 1)] public int CategoryId3 { get; set; } public virtual Category Category { get; set; } } 

Eu acredito que a maneira mais fácil é usar a anotação de dados na propriedade de navegação como este: [ForeignKey("CategoryId1, CategoryId2")]

 public class Category { [Key, Column(Order = 0)] public int CategoryId1 { get; set; } [Key, Column(Order = 1)] public int CategoryId2 { get; set; } public string Name { get; set; } public virtual ICollection Products { get; set; } } public class Product { [Key] public int ProductId { get; set; } public string Name { get; set; } public int CategoryId1 { get; set; } public int CategoryId2 { get; set; } [ForeignKey("CategoryId1, CategoryId2")] public virtual Category Category { get; set; } }