我在2017年的visual studio工作,我创建了一个具有以下属性的网站:
asp.net
MVC
个人用户帐户
但是我改变了AspNetUser的模型:
在模特中:
ApplicationUser (add)
{
...
[ForeignKey]
[InverseProperty("ApplicationUser")]
public virtual UserProfile UserProfile {get; set;}
}
UserProfile
{
...
[InverseProperty("UserProfile")]
public virtual ApplicationUser ApplicationUser {get; set;}
[ForeignKey]
[InverseProperty("UserProfile")]
public virtual UserImage {get; set;}
}
UserImage
{
...
[InverseProperty("UserImage")]
public virtual UserProfile {get; set;}
}
稍后我在nuget控制台中进行迁移,在我的视图中使用他们的个人资料保存我的用户,这项工作正常(我在我的数据库中检查了),但是,当我尝试获取用户的个人资料时是空的。
我使用了这段代码。 在我的控制器AccountController中我的视图UpdateUser我把这个
private readonly UserManager<ApplicationUser> _userManager;
public AccountController(..., UserManager<ApplicationUser> userManager) {
this._userManager = userManager;
....
}
public async Task<IActionResult> UpdateUser() {
ApplicationUser currentUser = await _userManager.GetUserAsync(User);
...
}
现在,当我的函数UpdateUser中的控制器执行操作await _userManager.GetUserAsync(User)
时,此加载不会打开相关表UserProfile,因为 currentUser 中的字段UserProfile为null。在asp.net 5中,我可以使用HttpContext.GetOwinContext<applicationDbContext>()
加载此个人资料,但aspnetcore没有这个
我如何做到(或者我需要更改哪些功能GetUserAsync(User)
自动加载用户及其个人资料)?
答案 0 :(得分:2)
EF Core不支持延迟加载。因此,除非您急切地或明确地加载它们,否则像UserProfile
这样的导航属性将为null。通过在查询中使用Include
来实现预先加载。但是,UserManager
无法为您提供机会。因此,您需要在获取用户后进行显式加载:
var currentUser = await _userManager.GetUserAsync(User);
await context.Entry(currentUser).Reference(x => x.UserProfile).LoadAsync();
或者,您实际上可以从上下文中提取用户。您不必使用UserManager
。它只是让事情变得更容易。
var currentUser = await context.Users.Include(x => x.UserProfile).SingleOrDefault(x => x.Id == User.Identity.GetUserId());
但是,应该注意UserProfile
应该完全消失。 Identity的全部要点之一是为您提供可扩展的用户对象。如果您需要用户拥有图片,请直接在ApplicationUser
上添加图片属性。拥有一个单独的配置文件对象只是另一个必须无缘无故的连接。 ASP.NET成员资格UserProfile
的唯一原因是因为User
不可扩展。