实体框架5,Code First多对多外键映射具有额外属性

时间:2012-11-23 02:40:50

标签: c# sql asp.net-mvc entity-framework-5 composite-key

我有这些课程

public class SecretQuestion
{
    [Key]
    public int SecretQuestionId { get; set; }
    [Required]
    public string Caption { get; set; }
}

public class UserSecretQuestion
{
    public SecretQuestion SecretQuestion { get; set; }
    public User User { get; set; }

    [Required]
    public string Answer { get; set; }
}

public class User
{
    [Key]
    public int UserId { get; set; }
    public string Email { get; set; }
    public string UserName { get; set; }
}

我希望UserSecretQuestion成为一个包含用户答案的​​连接表。问题是EF5不会为我创建这个表,因为它声称我需要该表上的一个键。

所以当然把 public int Id {get;组; } 在那里会修复它但是会在我的数据库中放置一个我不需要的字段。

是否有办法使此工作正常,以便secretquestionid和userid外键形成usersecretquestion表的复合键。

我注意到这里有几个问题,谈论多对多的关系,但没有(我能找到的)谈论这种关系,其中实体有额外的数据,例如'回答'。

1 个答案:

答案 0 :(得分:3)

首先,您必须将SecretQuestionIdUserId作为属性添加到UserSecretQuestion类。

public class UserSecretQuestion
{
    [Key, ForeignKey("SecretQuestion")]
    public int SecretQuestionId { get; set; }

    [Key, ForeignKey("User")]
    public int UserId { get; set; }

    [Required]
    public string Answer { get; set; }

    public SecretQuestion SecretQuestion { get; set; }
    public User User { get; set; }
}

然后,您必须覆盖OnModelCreating类中的DbContext方法,并告诉实体框架使用复合键作为连接表。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // Set composite keys
    modelBuilder.Entity<UserSecretQuestion>().HasKey(k => new { k.SecretQuestionId, k.UserID });
}