2014-10-12 10 views
5

mam tej konfiguracji z kodem pierwszego modelukorzystania z właściwości nawigacyjne z IdentityUser gdy LazyLoading jest wyłączony

public class TestContext :IdentityDbContext<TestUser> 
{ 
    public TestContext() 
     : base("TestConnection") 
    {   
     this.Configuration.LazyLoadingEnabled = false; 

    } 

    public DbSet<Customer> Customers{get;set;} 

} 

public class TestUser : IdentityUser 
{ 
    public virtual Customer Customer { get; set; } 
} 

public class Customer 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName {get; set;} 
} 

Mam rozszerzyła IdentityUser zawiera instancję klasy „Klient”.

Rozważmy teraz ten kod:

var user = UserManager.FindById("some id");     
if (user != null) 
{  
    string str=user.Customer.FirstName; //since lazy loading is off, user.Customer is null and hence gives null reference exception. 
} 

od leniwy załadunku jest wyłączony, user.Customer jest nieważne i tym samym daje wyjątku null odniesienia. Cieszę się, jeśli ktoś może mi pomóc w dostępie do właściwości nawigacyjnych IdentityUser, gdy LazyLoading jest wyłączony.

Dzięki.

+0

Czy konfiguracja odbywa się na relacji pomiędzy użytkownikiem UżytkownikTestowy a Klientem? – jd4u

+0

Czy potrzebujemy specjalnej konfiguracji dla tej relacji? Przykro mi, ale nie jestem tego świadomy, proszę, oświeć mnie. –

+0

Dwie rzeczy: 1. Metoda OnModelCreating z DbContext i 2. LazyLoadingEnabled: http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/reading-related-data-with- the-entity-framework-in-an-asp-net-mvc-application – jd4u

Odpowiedz

8

Jeśli zawsze chcesz załadować powiązane dane bez używania Lazy Loading, musisz napisać własną implementację UserStore i podłączyć ją do swojego UserManager. Na przykład ..

public class ApplicationUserStore : UserStore<TestUser> 
{ 
    public ApplicationUserStore(TestContext context) : base(context) 
    { 
    } 

    public override TestUser FindByIdAsync(string userId) 
    { 
     return Users.Include(c => c.Customer).FirstOrDefault(u => u.Id == userId); 
     //you may want to chain in some other .Include()s like Roles, Claims, Logins etc.. 
    } 
} 

następnie podczas tworzenia UserManager, plugin ten realizację UserStore, a Twoje dane zostaną załadowane Customer z użytkownikiem .. może to wyglądać ..

public class TestUserManager : UserManager<TestUser> 
{ 
    public TestUserManager() : base(new ApplicationUserStore(new TestContext())) 
    { 
    } 

} 
W zależności od projektu implementacja

będzie inna.

+1

Ty uratowałeś mój dzień. Zdałem sobie sprawę, że chciwe ładowanie nie działa z IdentityDbContext, więc jest to obejście tego problemu. – hbulens

4

I rozwiązali z tego:

Tworzenie niestandardowego UserManager

public class ApplicationUserManager : UserManager<ApplicationUser> 
{ 
    public ApplicationUserManager(IUserStore<ApplicationUser> store, IOptions<IdentityOptions> optionsAccessor, IPasswordHasher<ApplicationUser> passwordHasher, IEnumerable<IUserValidator<ApplicationUser>> userValidators, IEnumerable<IPasswordValidator<ApplicationUser>> passwordValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, IServiceProvider services, ILogger<UserManager<ApplicationUser>> logger, IHttpContextAccessor contextAccessor) : base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, services, logger, contextAccessor) { } 

    public override Task<ApplicationUser> FindByIdAsync(string userId) 
    { 
     return Users.Include(c => c.Esercizio).FirstOrDefaultAsync(u => u.Id == userId); 
    } 
} 

Replace domyślnych usługi UserManager

w twojej ConfigureServices dodać to:

services.AddIdentity<ApplicationUser, IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders().AddUserManager<ApplicationUserManager>(); 

Zmiany argumenty za DI

z

[FromServices]UserManager<ApplicationUser> userManager 

do

[FromServices]ApplicationUserManager userManager 

Mam nadzieję, że to pomoże

+0

Dziękuję raz na milion!Miałem wszystko, ale zrezygnowałem z tego sposobu wykonania tej czynności i zamierzałem wykonać kolejne wywołanie bazy danych, aby pobrać niezbędny obiekt, ponieważ wszystkie rozwiązania, jakie mogłem znaleźć, dotyczyły przeważania prawie całej struktury! –