AspNetCore为AspNetUser添加新的数据库关系

时间:2018-01-16 15:36:55

标签: c# visual-studio-2017 asp.net-core-mvc

我在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)自动加载用户及其个人资料)?

1 个答案:

答案 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 可扩展。