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 關注
- 127 瀏覽
添加回答
舉報