代码优先 - 两个外键作为主键,无法添加迁移

时间:2013-08-10 22:04:33

标签: entity-framework ef-code-first ef-migrations

我的用户表:

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

        public virtual ICollection<PollVote> PollVotes { get; set; }
    }

我的民意调查表:

public class Poll
    {
        [Key]
        public int PollId { get; set; }

        public virtual ICollection<PollVote> PollVotes { get; set; }
    }

我的民意调查表

public class PollVote
    {
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]        
        public int VoteId { get; set; }

        [Key]
        public int PollId { get; set; }

        [Key]
        public int UserId { get; set; }

        public DateTime TimeVoted { get; set; }
        public int Answer { get; set; }

        public virtual Poll Poll { get; set; }
        public virtual User User { get; set; }
    }

我的配置:

//User config:
             this.HasMany(x => x.PollVotes)
                .WithRequired()
                .HasForeignKey(x => x.UserId)
                .WillCascadeOnDelete(false);

//Poll Config
            this.HasMany(x => x.PollVotes)
                .WithRequired()
                .HasForeignKey(x => x.PollId)
                .WillCascadeOnDelete(false);

//PollVote Config
            this.HasKey(x => x.UserId)
                .HasRequired(x => x.User)
                .WithMany()
                .HasForeignKey(x => x.UserId);
            this.HasKey(x => x.PollId)
                .HasRequired(x => x.Poll)
                .WithMany()
                .HasForeignKey(x => x.PollId);

关系是:一个民意调查可以有很多票,但一个用户只能对每个民意调查投一票。

当我在PM-Console

中尝试Add-Migration时出现此错误
  

\ tSystem.Data.Entity.Edm.EdmAssociationEnd :: Multiplicity在关系'PollVote_Poll'中的角色'PollVote_Poll_Source'中无效。由于“从属角色”是指关键属性,因此从属角色的多重性的上限必须为“1”。   \ tSystem.Data.Entity.Edm.EdmAssociationEnd :: Multiplicity在关系'Poll_PollVotes'中的角色'Poll_PollVotes_Target'中无效。由于“从属角色”是指关键属性,因此从属角色的多重性的上限必须为“1”。

有什么建议吗?

1 个答案:

答案 0 :(得分:4)

通过将[Column]属性添加到数据注释...

来指定组合键
    [Key, Column(Order = 1)]
    public int PollId { get; set; }

    [Key, Column(Order = 2)]
    public int UserId { get; set; }

...或者使用Fluent API的匿名对象:

this.HasKey(x => new { x.UserId, x.PollId });

this.HasRequired(x => x.User)
    .WithMany(u => u.PollVotes)
    .HasForeignKey(x => x.UserId);

this.HasRequired(x => x.Poll)
    .WithMany(p => p.PollVotes)
    .HasForeignKey(x => x.PollId);

不要忘记WithMany中反向导航属性的lambda表达式,如上所示,并删除UserConfigPollConfig中的冗余配置。