如何使用Entity Framework Core 2.2播种自引用树

时间:2019-03-26 14:25:12

标签: entity-framework-core entity-framework-core-2.2

当我尝试添加迁移时,出现以下异常:

  

无法添加实体类型“流派”的种子实体,因为它设置了导航“ SubGenres”。要建立关系种子,您需要将相关实体种子添加到“流派”并指定外键值{'ParentId'}

如何在EntityFrameworkCore 2.2内正确设置种子

我有下一个实体

public class Genre
{
    [Key] public int Id { get; set; }

    [Required] [MaxLength(50)] public string Name { get; set; }

    public virtual ICollection<GameGenre> GameGenre { get; set; } = new List<GameGenre>();
    public int? ParentId { get; set; }
    public virtual Genre ParentGenre { get; set; }
    public virtual ICollection<Genre> SubGenres { get; set; } = new List<Genre>();
}

DbContext

public class OnlineGameContext : DbContext
{
    public OnlineGameContext(DbContextOptions<OnlineGameContext> options)
        : base(options)
    {
    }

    public DbSet<Genre> Genres { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder
            .Entity<Genre>()
            .HasMany(u => u.SubGenres)
            .WithOne(p => p.ParentGenre)
            .HasForeignKey(p => p.ParentId);

       modelBuilder.Entity<Genre>().HasData(DefaultGenresFactories.Action);
       base.OnModelCreating(modelBuilder);

    }

}

工厂

public static class DefaultGenresFactories
{
    public static Genre Action =>
        new Genre
        {
            Id = 5,
            Name = "Action",
            SubGenres = DefaultSubGenresFactories.Action
        };

}



public static class DefaultSubGenresFactories
 {
        public static ICollection<Genre> Action => new List<Genre>
        {
            new Genre
            {
                Id = 15,
                Name = "FPS",
                ParentId = 5
            },
            new Genre
            {
                Id = 16,
                Name = "TPS",
                ParentId = 5
            },
            new Genre
            {
                Id = 17,
                Name = "Misc",
                ParentId = 5
            }
        };
}

1 个答案:

答案 0 :(得分:2)

该异常消息告诉您使用HasData方法进行播种时不能使用导航属性,而只能通过FK属性指定关系。

换句话说,您不能使用SubGenresParentGenre导航属性来指定关系,只能通过ParentId属性来指定它们。

因此删除

SubGenres = DefaultSubGenresFactories.Action

行,或者将DefaultSubGenresFactories.ActionDefaultGenresFactories.Action合并到Genre的单个列表中,并在HasData调用中使用该列表,或者如果您想保留{ {1}}和DefaultGenresFactories类与当前的类分开,只需为两者(其附加)调用DefaultSubGenresFactories

HasData