使用EF Core 2.0 Code First将2个外键作为主键

时间:2018-05-17 18:41:14

标签: c# entity-framework-core

我有两张桌子:评论

public class Comment {
  CommentID { get; set; }
  ....
}

public class Like {
  CommentID { get; set; }
  UserID { get; set; }
}

首先使用实体​​框架核心2.0代码,我想定义我的" Like" model只有两个字段引用其他主键(作为外键),但我希望值的组合成为表的主键。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:3)

所以,这就是这里发生的事情:

1)有两个类:CommentUser

2)第三个类Like将引用(导航属性)保存到对应于数据库中的外键的两个类:UserIdCommentId。我明确使用了ForeignKey属性,因此您可以清楚EF将使用哪些属性作为外键。在这种特殊情况下,您可以省略此属性,因为EF会自动计算出来(因为两个类中的名称都匹配)。请注意,拥有外键并非强制要求,但它们具有优势。

3)UserIdCommentId包含复合键。 Column属性配置数据库中列的顺序(所谓的序数)。这对EF很重要。

4)UserComment类也有导航属性(因为它是one关系的one-to-many侧):Likes

5)最后,always使用Table属性来避免复数问题,因为there's no way会将其关闭。

[Table("Comment")]
public class Comment
{
    public int CommentID { get; set; }
    public List<Like> Likes { get; set; }
}

[Table("User")]
public class User
{
    public int UserId { get; set; }
    public List<Like> Likes { get; set; }
}

[Table("Like")]
public class Like
{
    [Key]
    [Column(Order = 1)]
    public int CommentID { get; set; }
    [Key]
    [Column(Order = 2)]
    public int UserID { get; set; }

    [ForeignKey("CommentId")]
    public Comment Comment { get; set; }
    [ForeignKey("UserId")]
    public User User { get; set; }
}

<强>更新

在EF Core中设置复合键

用于指定复合主键的Key(和Column)属性实际上在EF Core中不起作用 - 它们在EF6中工作。要在EF Core中配置组合键,您需要使用Fluent配置。

您有两种选择。

选项1。OnModelCreatingMethod中进行所有配置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Like>().HasKey(l => new { l.CommentID, l.UserID });
}

选项2。将所有配置移至单独的类并将其应用于OnModelCreating

1)为配置创建单独的类

class LikeConfiguration : IEntityTypeConfiguration<Like>
{
    public void Configure(EntityTypeBuilder<Like> builder)
    {
        builder.HasKey(l => new { l.CommentID, l.UserID });
    }
}

2)应用配置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.ApplyConfiguration(new LikeConfiguration());
}

选择您喜欢的任何选项。

如您所见,要在Fluent配置中配置复合键,您需要使用anonymous type。再次,属性的顺序很重要。