【问题标题】:2 Foreign Keys as Primary Key using EF Core 2.0 Code First2 外键作为主键使用 EF Core 2.0 代码优先
【发布时间】:2018-10-28 03:15:39
【问题描述】:

我有两个表格:CommentLike

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

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

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

【问题讨论】:

  • Keys (primary),具体以开头的部分“也可以使用Fluent API配置多个属性作为实体的键(称为复合键)”我>

标签: c# entity-framework-core


【解决方案1】:

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

1) 有两个类:CommentUser

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

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

4) UserComment 类也具有导航属性(因为它是 oneone-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 Configuration。

你有两种选择。

选项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 Configuration 中配置复合键,您需要使用 anonymous type。同样,属性的顺序很重要。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-02-13
  • 2018-05-31
  • 2013-01-15
  • 2022-01-01
  • 2014-03-28
  • 1970-01-01
  • 2016-01-31
相关资源
最近更新 更多