【问题标题】:How do I seed a foreign key one-to-many list relation?如何播种外键一对多列表关系?
【发布时间】:2021-08-15 15:29:49
【问题描述】:

我有班级/桌子:

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 数据库更新时,我得到:

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

如何解决此错误?

【问题讨论】:

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


    【解决方案1】:

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

    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;}
    
    }
    

    【讨论】:

      猜你喜欢
      • 2015-12-23
      • 2019-11-17
      • 1970-01-01
      • 2017-12-29
      • 2019-01-05
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      相关资源
      最近更新 更多