2012-12-27 76 views
7

我有兩個表ProjectsTaskTask是一個項目的弱實體,所以任務的複合主鍵是(ProjectId & TaskID)。我試着用下面的代碼來做這件事,但它給出了一個錯誤使用實體框架創建複合主鍵4.1

無法定義表'任務'中的可爲空的列的PRIMARY KEY約束。

我使用代碼優先方法來創建表,我已經確保了該列不爲空,但它仍然沒有工作。請幫忙!

public class Task 
{ 
    [ForeignKey("ProjectId")] 
    public Project Project { get; set; } 
    [Required] 
    public int ProjectId { get; set; } 

    //[Key, Column(Order = 1)] 
    [Required] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public virtual int TaskID { get; set; } 
    ... 
} 

//using FluentAPI 
protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Entity<Task>().HasRequired(p => p.Project); 
    modelBuilder.Entity<Task>().HasKey(p => new { p.ProjectId, p.TaskID }); 

    modelBuilder.Entity<Project>() 
      .HasRequired(e=> e.Employee) 
      .WithMany() 
      .WillCascadeOnDelete(false); 
} 

回答

24

碰到這個尋找別的東西,有點晚了,但這個映射精複合鍵,我

[Key, Column(Order=1) ] 
    public int KeyId { get; set; } 
    [Key, Column(Order = 2)] 
    public int Key1Id { get; set; } 
    [Key, Column(Order = 3)] 
    public int Key2Id { get; set; } 
    [Key, Column(Order = 4)] 
    public int Key3Id { get; set; } 

希望這可以幫助別人。

+1

這裏是一個確認這個soltuion的教程:http://www.entityframeworktutorial.net/code-first/key-dataannotations-attribute-in-code-first.aspx – CodeToad