Jes*_*yer 3 c# entity-framework-core
我有两个表:Comment和Like。
public class Comment {
CommentID { get; set; }
....
}
public class Like {
CommentID { get; set; }
UserID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
首先使用实体框架核心 2.0 代码,我想将我的“Like”模型定义为仅具有引用其他主键(作为外键)的两个字段,但我希望这些值的组合成为表的主键. 任何帮助,将不胜感激!
所以,这里发生了什么:
1) 有两个类:Comment和User。
2) 第三个类,Like,保存对与数据库中的外键对应的两个类的引用(导航属性):UserId和CommentId。我明确使用了ForeignKey属性,以便您清楚 EF 将使用哪些属性作为外键。在这种特殊情况下,您可以省略此属性,因为 EF 会自动计算出它(因为两个类中的名称都匹配)。请注意,外键不是强制性的,但它们有优势。
3)UserId和CommentId包括组合键。该Column属性配置数据库中列的顺序(所谓的序数)。这对 EF 很重要。
4)User和Comment类也具有导航性能(因为它的one侧面的one-to-many关系)Likes。
5) 最后,always使用Table属性来避免复数问题,因为无法将其关闭。
[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; }
}
Run Code Online (Sandbox Code Playgroud)
更新
在 EF Core 中设置复合键
用于指定复合主键的Key(and 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 });
}
Run Code Online (Sandbox Code Playgroud)
选项 2.将所有配置移动到单独的类中并将其应用于OnModelCreating:
1)为配置创建单独的类
class LikeConfiguration : IEntityTypeConfiguration<Like>
{
public void Configure(EntityTypeBuilder<Like> builder)
{
builder.HasKey(l => new { l.CommentID, l.UserID });
}
}
Run Code Online (Sandbox Code Playgroud)
2)应用配置:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfiguration(new LikeConfiguration());
}
Run Code Online (Sandbox Code Playgroud)
选择您喜欢的任何选项。
如您所见,要在 Fluent Configuration 中配置复合键,您需要使用匿名类型。同样,属性的顺序很重要。