2014-10-12 16 views
5

: Ben "Müşteri" Sınıf örneğini içermek üzere IdentityUser uzattığımızıErişim Navigasyon Özellikleri LazyLoading kapalı ben kod ilk modeli ile bu kurulum ettik

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

. geç yükleme kapalı

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

beri user.Customer null ve dolayısıyla null başvuru özel verir:

Şimdi bu kodu düşünün. LazyLoading kapalıyken, IdentityUser öğesinin Gezinme Özelliklerine erişmeme yardımcı olabilecek herhangi biri olursa ben memnun olurum.

Teşekkürler.

+0

yapılandırma TestUser ile Müşteri arasındaki ilişki için yapılması mı yardımcı olur umarım? – jd4u

+0

Bu ilişki için herhangi bir özel yapılandırmaya ihtiyacımız var mı? Üzgünüm, ama farkında değilim, lütfen beni aydınlatın. –

+0

İki şeyi gözden geçirin: 1. OnModelCreating yöntemi DbContext & 2. LazyLoadingEnabled: http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/reading-related-data-with- varlık-çerçeve-in-bir-net-net-mvc-uygulama – jd4u

cevap

8

her zaman o zaman UserStore kendi uygulama yazmak ve senin UserManager içine fiş gerekir Tembel Yükleniyor kullanmadan ilgili verileri yüklemek isteyen vardır. .. Eğer UserManager oluştururken Örneğin ..

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

sonra, UserStore bu uygulama eklentisi, ve Customer veri .. Böyle bir şey görünebilir kullanıcı ile yüklenecek

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

} 

projenize bağlı olarak, UserManager uygulaması farklı olacaktır.

+1

Sen efendim günümü kurtardınız. İstekli yüklemenin bir IdentityDbContext ile çalışmadığını fark ettim, bu yüzden bu bir çözümdür. – hbulens

4

Bununla çözdük:

:

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

varsayılan UserManager servisi sizin ConfigureServices ise

değiştirin özel UserManager oluşturma Bu eklenti

[FromServices]ApplicationUserManager userManager 

için

[FromServices]UserManager<ApplicationUser> userManager 

gelen DI

için

Değişim argümanlar bu

+0

Bir milyon kez teşekkür ederim!Tüm bu çözümlerden vazgeçtim ve bulabildiğim tüm çözümler neredeyse tüm çerçeveyi geçersiz kılmayı gerektirdiğinden gerekli nesneyi çekmek için başka bir veritabanı çağrısı yapacaktı! –

İlgili konular