Код первого сопоставления для иерархии Entity Framework

#mapping #ef-code-first #entity-relationship #entity-framework-4.1

#сопоставление #ef-code-first #сущность-отношение #entity-framework-4.1

Вопрос:

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

 public class Category
{
    public string Id { get; set; }
    public string Description { get; set; }
    public Category Parent { get; set; }
    public ICollection<Category> Children { get; set; }
    public ICollection<Product> Products { get; set; }
}
  

С таблицей базы данных, которая выглядит как

 Categories
    Id (PK varchar(5))
    Description (nvarchar(50))
    ParentId (FK varchar(5))
  

Но я в тупике, когда дело доходит до настройки сопоставления

 modelBuilder.Entity<Category>()
    .HasMany(x => x.Children)
    .WithMany(x => x.Children)
    .Map(m =>
        {
            m.ToTable("Categories");
            m.MapLeftKey(x => x.Id, "Id");
            m.MapRightKey(x => x.Id, "ParentId");
        });
  

Я могу понять, почему происходит сбой сопоставления (исключение StackOverflowException), но не уверен, как это исправить. Любая помощь была бы с благодарностью оценена.

При этом используется последняя версия EF (4.1?).

Спасибо!

Ответ №1:

Почему вы отображаете отношение «многие ко многим» в одном и том же свойстве навигации? Это совершенно неверно. Во-первых, ваша таблица, очевидно, ожидает отношения «один ко многим». Даже если вам нужно отношение «многие ко многим», вы не можете использовать для этого одно и то же свойство навигации.

Просто попробуйте:

 modelBuilder.Entity<Category>()
            .HasMany(x => x.Children)
            .WithOptional(y => y.Parent)
            .Map(m => m.MapKey("ParentId"));
  

Комментарии:

1. Потрясающе. Спасибо. Также нужно не забыть сделать эти свойства виртуальными.