亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

查詢數據庫,列值為空?

查詢數據庫,列值為空?

C#
莫回無 2023-07-09 10:22:29
我有一個用戶登錄然后它調用控制器。我在用戶表中搜索電子郵件匹配并將其保存到用戶變量中。但是當我嘗試檢查它是否是管理員用戶時,權限列為空,它是空引用。為什么用戶不首先或默認提取所有列數據,我檢查數據庫并且permissionId在那里,但是當我檢查所述行的值時將其拉為空。我真的很清楚,這是我的第一個更大的項目,也是我第一次似乎無法在谷歌上找到答案。這是實體:用戶:public class User    {        public int    UserId        { get; set; }        [Column(TypeName = "VARCHAR(100)")]        [StringLength(100)]        [Required]        public string FirstName     { get; set; }        [Column(TypeName = "VARCHAR(100)")]        [StringLength(100)]        [Required]        public string LastName      { get; set; }        [Column(TypeName = "VARCHAR(100)")]        [StringLength(250)]        [Required]        public string Email         { get; set; }        [Required]        public string Password      { get; set; }        [Required]        public string UserName      { get; set; }        //The user can have many posts         public List<Post> Post      { get; set; }        public virtual Permissions Permissions { get; set; }    }權限:public class Permissions    {        public int PermissionsID {get; set;}        [Required]        public bool admin { get; set; }        [Required]        public bool StandUser { get; set; }        //Many Users can have a permission, this makes the foreign key for the Post Table.        public List<User> User { get; set; }    }這是登錄后控制器:[HttpPost]        public IActionResult Login(LoginViewModel loginViewModel)        {            //We're grabbing the plain text password so we can hash it later.             loginViewModel.plainTextPassword = loginViewModel.user.Password;            //Searching for the users emaill address and gathering the user information.             User userInfo = _context.Users.FirstOrDefault(x => x.Email == loginViewModel.user.Email);我希望 userInfo 的所有行都不為空,以便稍后我可以檢查用戶是否是管理員。
查看完整描述

1 回答

?
qq_笑_17

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


查看完整回答
反對 回復 2023-07-09
  • 1 回答
  • 0 關注
  • 127 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號