C# LazyLoading关闭时从IdentityUser访问导航属性

C# LazyLoading关闭时从IdentityUser访问导航属性,c#,.net,entity-framework,ef-code-first,asp.net-identity,C#,.net,Entity Framework,Ef Code First,Asp.net Identity,我使用“代码优先”模式进行了此设置: public class TestContext :IdentityDbContext<TestUser> { public TestContext() : base("TestConnection") { this.Configuration.LazyLoadingEnabled = false; } public DbSet<Customer>

我使用“代码优先”模式进行了此设置:

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;}
}
由于禁用了延迟加载,user.Customer为null,因此给出了null引用异常。 如果有人能在LazyLoading关闭时帮助我访问IdentityUser的导航属性,我将非常高兴


谢谢。

如果您总是希望在不使用延迟加载的情况下加载相关数据,那么您需要编写自己的
UserStore
实现,并将其插入到
UserManager
中。例如

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

根据您的项目,用户管理器的实现将有所不同。

我已经解决了以下问题:

创建自定义用户管理器

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

我希望这有帮助

是否为TestUser和客户之间的关系进行了配置?我们是否需要为这种关系进行任何特殊配置?我很抱歉,但我不知道任何,请启发我。回顾两件事:1。DbContext的onmodel创建方法&2。懒汉:先生,你救了我一命。我意识到即时加载不适用于IdentityDbContext,所以这是解决方法。非常感谢!我几乎放弃了这种方法,打算再调用一次数据库来提取必要的对象,因为我能找到的所有解决方案都涉及覆盖几乎整个框架!
public class TestUserManager : UserManager<TestUser>
{
    public TestUserManager() : base(new ApplicationUserStore(new TestContext()))
    {
    }

}
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);
    }
}
services.AddIdentity<ApplicationUser, IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders().AddUserManager<ApplicationUserManager>();
[FromServices]UserManager<ApplicationUser> userManager
[FromServices]ApplicationUserManager userManager