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

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

Невозможно добавить начальный объект для типа объекта «Жанр», поскольку для него установлена ​​навигация «SubGenres».Чтобы заполнить отношения, вам нужно добавить начальный объект связанной сущности в 'Genre' и указать значения внешнего ключа {'ParentId'}

Как правильно настроить seed в 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 Ответ

2 голосов
/ 26 марта 2019

Сообщение об исключении говорит вам, что вы не можете использовать свойства навигации при заполнении с помощью метода 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);
...