首页 > 解决方案 > 如何播种外键一对多列表关系?

问题描述

我有班级/桌子:

public class Song
{
    [Key]
    public Guid Id { get; set; }
    [Required]
    public string Name { get; set; }
    [ForeignKey("FK_SongTags")]
    public List<Tag> Tags { get; set; }
}

类/表标签在哪里:

[Table("Tags")]
public class Tag
{
    [Key]
    public string Name { get; set; }
}

在我的上下文中,我称之为种子:

modelBuilder.Entity<Song>().HasData(new List<Song>
{
    new Song { Id = Guid.NewGuid(), Name = "Some random song", Tags = new List<Tag> { "pop", "rock" } }
});

当我执行dotnet ef database update时,我得到:

无法添加实体类型“歌曲”的种子实体,因为它设置了导航“标签”。要为关系播种,请将实体种子添加到“标签”并指定外键值 {“FK_SongTags”}。考虑使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”来查看涉及的属性值。

我该如何解决这个错误?

标签: c#sqlite.net-coreef-code-first.net-5

解决方案


您需要多对多关系,因为一首歌曲可以有多个标签,并且每个标签也可以用于另一首歌曲。尝试这个:

public class Song
{
    [Key]
    public Guid Id { get; set; }
    [Required]
    public string Name { get; set; }
  
    public virtual List<Tag> Tags { get; set; }
}


[Table("Tags")]
public class Tag
{
    [Key]
    public string Name { get; set; }
    public virtual List<Song> Songs{ get; set; }
}

进行更改后,您必须对 db 进行初始迁移。

但如果你仍然认为你需要一对多试试这个

[Table("Tags")]
public class Tag
{
    [Key]
    public string Name { get; set; }

    public Guid SongId {get; set;}
     public virtual Song Song {get; set;}

}

推荐阅读