2014-10-12 5 views
5

ich dieses Setup erstes Modell mit dem Code habe:Zugriff auf Navigationseigenschaften von IdentityUser wenn Lazy Loading ausgeschaltet ist

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;} 
} 

ich den IdentityUser verlängert habe eine Instanz von „Kunden“ Klasse enthält.

nun diesen Code betrachten:

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. 
} 

seit verzögertes Laden ausgeschaltet ist, user.Customer null ist und daher gibt NULL-Verweis Ausnahme. Ich freue mich, wenn mir jemand beim Zugriff auf die Navigationseigenschaften von IdentityUser helfen kann, wenn LazyLoading deaktiviert ist.

Danke.

+0

Ist hilft? – jd4u

+0

Brauchen wir eine spezielle Konfiguration für diese Beziehung? Es tut mir leid, aber mir ist nichts bekannt, bitte erleuchte mich. –

+0

Überprüfen Sie zwei Dinge: 1. OnModelCreating-Methode von DbContext & 2. LazyLoadingEnabled: http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/reading-related-data-with- the-entity-framework-in-einem-asp-net-mvc-application – jd4u

Antwort

8

Wenn Sie immer die zugehörigen Daten laden möchten, ohne Lazy Loading zu verwenden, müssen Sie Ihre eigene Implementierung des UserStore schreiben und diese in Ihr UserManager stecken. Zum Beispiel ..

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.. 
    } 
} 

dann, wenn Sie Ihren Usermanager erstellen, Plugin diese Implementierung der UserStore und Ihre Customer Daten werden mit dem Benutzer geladen werden .. dies etwas aussehen kann ..

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

} 

abhängig von Ihrem Projekt wird die UserManager Implementierung anders sein.

+1

Sie haben meinen Tag gerettet. Ich habe festgestellt, dass das Eager-Laden mit einem IdentityDbContext nicht funktioniert, daher ist dies der Workaround. – hbulens

4

Ich habe mit dieser gelöst:

einen benutzerdefinierten erstellen 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); 
    } 
} 

Standard-Usermanager Service ersetzen

In Ihrem ConfigureServices fügen Sie diese:

Konfiguration erfolgt für Beziehung zwischen Testuser und Kunden

ändern Argumente für DI

von

[FromServices]UserManager<ApplicationUser> userManager 

zu

[FromServices]ApplicationUserManager userManager 

Ich hoffe, das

+0

Danke mal eine Million!Ich hatte diese Art der Ausführung fast aufgegeben und würde einen weiteren Datenbankaufruf durchführen, um das notwendige Objekt zu ziehen, da alle Lösungen, die ich finden konnte, fast das gesamte Framework außer Kraft setzten! –