Как сохранить рекурсивную модель с помощью Entity Framework 5.0

1

Я новичок в инфраструктуре сущности и пытаюсь сохранить следующую модель в базе данных. Я смотрел этот урок. Я хочу сначала сохранить следующую модель базы данных, используя код, но я не мог заставить ее сохранить эту рекурсивную структуру. Он хранит только начальный корневой узел.

Моя модель выглядит так:

public abstract class Node : INode
{
    public int NodeId { get; set; }

    public Node()
    {
        Nodes = new List<INode>();
    }

    public INode ParentNode { get; set; }

    public List<INode> Nodes { get; private set; }

    public string Name { get; set; }
}

и производные подтипы:

public class Module : Node, IModule
{
}

public class Location: Node, ILocation
{
}

Интерфейсы:

public interface INode
{
    INode ParentNode { get; set; }

    List<INode> Nodes { get; }

    string Name { get; set; }
}

public interface IModule : INode
{
}

public interface ILocation : INode
{
}

Это мой DbContext:

public class SqlEntityContext : DbContext
{
    public DbSet<Node> Nodes { get; set; }
}

Затем я создаю модель одного родительского узла модуля, содержащего два локальных узла. Если я попытаюсь сохранить его с помощью этого кода

using (var db = new SqlEntityContext())
{
    db.SqlSystemNodes.Add(Root as SqlSystemNode);
    db.SaveChanges();
}

только корневой узел сохраняется в базе данных. Я попытался дать каждому подтипу собственный ключ, но без успеха. Как я могу хранить эту модель в базе данных, любые идеи? Возможно ли это?

  • 1
    Вы тоже пытались добавить все дочерние узлы в контекст? Похоже, вы не добавили внешний ключ для своего родительского узла, что затрудняет для EF распознавание желаемого отображения результатов. Проверьте созданную схему, если она создается так, как вы этого хотите.
Теги:
sql-server
entity-framework
recursion
localdb

1 ответ

0
Лучший ответ

Определили ли вы отношение родитель-ребенок в инициализаторе контекста db.

Инициализатор должен иметь такое же:

modelBuilder.Entity<Node>()
    .HasMany(o => o.Nodes)
    .WithOptional() // or .WithRequired()
    .Map(m => m.MapKey("ParentNodeId"));
  • 0
    Я бы, но я не могу найти способ получить доступ к инициализатору
  • 0
    нашел, попробую завтра, когда вернусь на работу
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню