我使用代码优先模型进行了此设置:
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/