Code First Mapping для иерархии Entity Framework

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

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?).

Спасибо!


person Joe    schedule 19.05.2011    source источник


Ответы (1)


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

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

modelBuilder.Entity<Category>()
            .HasMany(x => x.Children)
            .WithOptional(y => y.Parent)
            .Map(m => m.MapKey("ParentId"));
person Ladislav Mrnka    schedule 19.05.2011
comment
Потрясающий. Спасибо. Также нужно не забыть сделать эти свойства виртуальными. - person Joe; 20.05.2011