Как заполнить самообращающееся дерево ссылками, используя Entity Framework Core 2.2

Когда я пытаюсь добавить миграцию, возникает следующее исключение:

Начальный объект для типа объекта "Жанр" не может быть добавлен, поскольку для него установлена ​​навигация "SubGenres". Чтобы заполнить отношения, вам нужно добавить семя связанной сущности в 'Genre' и указать значения внешнего ключа {'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 ответ

Решение

Сообщение об исключении говорит вам, что вы не можете использовать свойства навигации при заполнении с HasData метод, но вместо этого вы можете указать отношения только через свойства FK.

Другими словами, вы не можете использовать SubGenres а также ParentGenre свойства навигации для указания отношений, они могут быть указаны только через ParentId имущество.

Так что удалите

SubGenres = DefaultSubGenresFactories.Action

линия, и либо объединить DefaultSubGenresFactories.Action а также DefaultGenresFactories.Action в единый список Genre и использовать этот список в HasData позвонить, или если вы хотите сохранить DefaultGenresFactories а также DefaultSubGenresFactories классы разделены, как они в настоящее время, просто позвоните HasData для обоих (это аддитивно):

modelBuilder.Entity<Genre>().HasData(DefaultGenresFactories.Action);
modelBuilder.Entity<Genre>().HasData(DefaultSubGenresFactories.Action);
Другие вопросы по тегам