2015-08-19 3 views
4

Я использую EF6/.Net 4.5.1 для извлечения данных для списка в пользовательском контроле на веб-форме. Я изменил ApplicationUser, чтобы включить свойство навигации [1: 1], используя атрибут FK, который отлично работает.Принудительное использование приложения EF для загрузки свойств навигации

public class ApplicationUser : IdentityUser 
{ 
    public ApplicationUser() 
    { 
     CreateDate = DateTime.Now; 
     :\\ deleted stuff 
    } 

    public int TaxID { get; set; } 
    public System.Guid ApplicationId { get; set; } 
    :\\ deleted stuff 

    [ForeignKey("TaxID")] 
    public virtual Personnel Personnel { get; set; } 
} 

Модель была перенесена и протестирована для хранения и извлечения.

Все работает нормально с полной обратной передачей.

Однако я добавил кнопку на веб-странице, которая открывает и закрывает div, который содержит UserControl, ответственный за создание нового пользователя. UserControl выдает событие, которое потребляется контейнером. Затем контейнер закрывает div, содержащий UC, снова открывает div с Listview, вызывает Listview DataBind(), который вызывает GetAllUsers().

Код:

public IQueryable<ApplicationUser> GetAllUsers() 
{ 
    var manager = HttpContext.Current.GetOwinContext() 
          .GetUserManager<ApplicationUserManager>(); 
    var users = manager.Users.OrderBy(c => c.TaxID); 

    return users; 
} 

Проблема возникает после того, как UserControl возвращает управление контейнер.

Первое извлечение - всегда имеет ApplicationUser, у которого НЕ загружено свойство навигации. Это означает, что определенные поля никогда не заполняются в списке.

Последующие извлечения (обновление страницы или вызов Редактирование строки), однако, похоже, приводят к появлению свойств навигации.

Image Showing First and Second Retrieve

  1. Как я могу заставить EF Включить навигационное свойство. В этом контексте не существует синтаксиса manager.Users.Include().

  2. Только объекты, перечисленные как dynamicproxies ApplicationUser, похоже, имеют навигационное свойство. Поэтому я озадачен тем, почему первоначальное извлечение никогда не является динамическим прокси.

  3. Датаппарат listview требует, чтобы IQueryable реализовал свой пейджинг. Я не вызываю .ToList(), поскольку Datapager знает, когда это работает отлично ... после обновления полной страницы. Почему требуется обновление страницы для свойств навигации?

Любая помощь ... заранее спасибо ...

ответ

5

Добавить

using System.Data.Entity; 

, а затем вы можете использовать Include:

var users = manager.Users.Include(x=> x.Personnel).OrderBy(c => c.TaxID); 

Если вы хотите включить навигации в любом месте, в IdentityConfig.cs файл переопределения ApplicationUserManager.Users вот так:

public class ApplicationUserManager : UserManager<ApplicationUser> 
{ 
    public override IQueryable<ApplicationUser> Users 
    { 
     get 
     { 
      return base.Users.Include(x=>x.Personnel);//include what you want here 
     } 
    } 
    //Rest of the original code 
} 
+0

Это сработало! Спасибо!!! Identity Framework действительно заставляет вас идти хммм ... – Renshai

Смежные вопросы