1 回答
TA贡献1818条经验 获得超7个赞
通常,延迟加载会在幕后处理此问题,但如果您没有启用或可用(EF Core 2.1 之前的版本),您将留下 #null 引用。
选项:
1) 预加载权限.Include(x => x.Permissions)。
正如法比奥上面评论的那样,这应该可以解决您眼前的问题。急切加载的考虑因素是您必须显式包含您想要引用的所有内容,这可能意味着加载比您需要的更多的数据。
2)用于Select获取您需要的数据。
通过利用,Select您可以消除对急切加载或延迟加载命中的担忧,并生成经过优化以仅返回您关心的数据的 SQL。如果您想要根据数据状态执行某些逻辑,您可以使用匿名类型来表示数据。在其他情况下,您想要将数据返回到视图,请使用 Select (或 Automapper 的ProjectTo)来填充视图模型。
例如:
[HttpPost]
public IActionResult Login(LoginViewModel loginViewModel)
{
loginViewModel.plainTextPassword = loginViewModel.user.Password;
var userInfo = _context.Users.Where(x => x.Email == loginViewModel.user.Email)
.Select(x => new
{
x.UserId,
x.FirstName,
x.LastName,
x.Password,
IsAdmin = x.Permissions.Admin
}).SingleOrDefault();
if (userInfo == null)
{
ViewBag.Error = "Sorry, but we couldn't log you in.";
return View();
}
else if (Hashing.Confirm(loginViewModel.plainTextPassword, userInfo.Password, Supported_Ha.SHA256))
{
HttpContext.Session.SetString("UserFirstName", userInfo.FirstName);
HttpContext.Session.SetString("UserLastName", userInfo.LastName);
HttpContext.Session.SetInt32("UserUserId", userInfo.UserId);
HttpContext.Session.SetString("IsAdmin", userInfo.IsAdmin.ToString());
ViewBag.IsAdmin = userInfo.IsAdmin.ToString();
ViewBag.SessionUserName = userInfo.FirstName;
return RedirectToAction("Index");
}
ViewBag.Error = "Sorry, but we couldn't log you in.";
return View("Index");
}
主题演讲:我们使用 Select 只检索我们需要的用户列(名称、ID、密码哈希)以及权限引用中的“admin”标志。它被加载到一个临时容器中,我们可以在此方法中引用它。每当您需要单行而不是/时,最好使用Single/ ,因为可以屏蔽意外的重复数据场景。IMO /切勿在没有子句的情况下使用,以确保结果一致。SingleOrDefaultFirstFirstOrDefaultFirstFirstOrDefaultOrderBy
- 1 回答
- 0 关注
- 100 浏览
添加回答
举报