Как получить вложенный атрибут внешнего ключа с помощью Entity Framework - PullRequest
1 голос
/ 02 апреля 2012

У меня есть вопрос относительно внешнего ключа в платформе сущностей (EF4).

Допустим, у меня есть классы:

public class E1
{
   public int Id{get;set;}
   Public string name{get;set;}
}
public class E2
{
   [ForeignKey("e1")]
   public int E1Id{get;set;}

   [ForeignKey("E1Id")]
   public E1 e1{get;set;}

}
public class E3
{
   [ForeignKey("e2")]
   public int E2Id{get;set;}

   [ForeignKey("E2Id")]
   public E2 e2{get;set;}
}
public class E4
{
}

соответственно, и я предполагаю, что хочу получить доступ к атрибуту class E1 в class E4 путем вызова через объект E3 (который внутренне вызывает E2), а также E2, вызывающего E1, как показано выше, но когда я пытаюсь получить доступ к атрибуту E1, он выдает object null reference исключение, так как можно получить атрибуты E1?

1 Ответ

2 голосов
/ 02 апреля 2012

Вам нужно использовать либо готовую загрузку, либо отложенную загрузку, либо явную загрузку, чтобы принудительно загрузить ваши отношения.

При активной загрузке ваши отношения будут загружены сразу же, когда вы загрузите основной объект:

var e4 = context.E4Set.Include(e => e.E3.E2.E1).First(...);

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

. Для явной загрузки необходимо вручную выполнить загрузку для уже загруженного объекта:

var e4 = context.EF4Set.First(...);
var entry = context.Entry(e4);
entry.Reference(e => e3).Load();

, и выможно сочетать с энергичной загрузкой:

entry.Reference(e => e3).Query().Include(e => e.E2.E1).Load();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...