Проблема рекуррентности Entity Framework - PullRequest
2 голосов
/ 26 марта 2011

Я работаю с EF 4.1 CTP5 и SQL Server 2008. Мне нужно понять, как решить проблему с рекуррентностью.У меня есть следующие 2 класса:

public class Nation   
{
    public int ID {get; set;}
    public string name {get;set;}
    public List<NationAlly> NationAllies {get;set;}
}

public class NationAlly
{
    public int ID {get; set;}
    public int level {get;set;}
    public Nation Owner {get; set;}
    public Nation toNation {get;set;}
}

Объекты отображаются в базу данных с двумя таблицами (Nations и NationAllies).Кроме того, есть два отношения.1) От NationAllies.OwnerID до Nation.ID 2) От NationAllies.ToNationID до Nation.ID

Когда я пытаюсь получить объект типа Nation из моей базы данных, я получаю доступ к классу DbContext NationDB:

Nation selectedNation = ((nationDB.Nations.Include("NationAllies")).Where(m => m.name == "France")).FirstOrDefault();

Проблема в том, что я получил объект selectedNation, у которого есть список NationAllies, но у каждого NationAlly в списке есть поле toNation = null.Прежде всего я хотел бы, чтобы поле toNation извлекало правильную информацию из базы данных.Как мне это сделать?

Тогда, конечно, нация будет связана с другими национальными союзниками, которые в свою очередь будут иметь другую нацию.Как можно построить рекурсивную карту?Моя идея состоит в том, чтобы перемещаться по карте до определенного уровня, запрашивая базу данных особым образом.При этом, как лучше всего добиться хороших скоростных показателей?

1 Ответ

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

Похоже, NationAllies - это таблица соединений с дополнительными свойствами.Проблема в том, что EF не хочет загружать вложенные свойства навигации, если вы не укажете их явно в методе Include.Если вы хотите, чтобы ToNation был заполнен, вы должны использовать

nationDB.Nations.Include("NationAllies.toNation")

или

nationDB.Nations.Include(n => n.NationAllies.Select(na => na.toNation))

Вы также можете включить отложенную загрузку.Сделайте все ваши свойства навигации virtual (toNation, NationOwner и NationAllies), и если вы не закроете контекст, все свойства будут загружены при первом обращении к ним.

...