我使用代码优先模型进行了此设置:

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

我扩展了IdentityUser,使其包含“Customer”类的实例。

现在考虑以下代码:
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.
}

由于延迟加载已关闭,所以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..
    }
}

然后,当您创建UserManager时,请插入UserStore的此实现,并且您的Customer数据将随用户一起加载。
public class TestUserManager : UserManager<TestUser>
{
    public TestUserManager() : base(new ApplicationUserStore(new TestContext()))
    {
    }

}

根据您的项目,UserManager实现会有所不同。

关于c# - 禁用LazyLoading时从IdentityUser访问导航属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26324550/

10-10 07:00