繁体   English   中英

C#、ASP.NET MVC、实体框架:user.cart 项目为 null

[英]C#, ASP.NET MVC, Entity Framework : user.cart items are null

我正在使用 ASP.NET MVC 和实体框架。 我有一个 class 处理 SQL 称为DataLayer

DataLayer 中有一个User DataLayer

我构建了一个 function,其中包含购物车的所有物品并通过 ID 返回用户,然后将数据层中的用户设置为找到的用户(以便它可以登录)。

function 代码为:

public User userWithInclude(int? userId)
{
    List<User> users = Users.Include(x => x.Cart)
                            .Include(x => x.Cart.shakes)
                            .Include(x => x.Cart.equipmentList)
                            .Include(x => x.orders)
                            .Include(m => m.menus).ToList();

    User user = users.ToList().Find(x => x.ID == userId);

    return user;
}

这是 function 登录的片段:

public IActionResult LogInUser(User vm)
{
    User user = DataLayer.Data.Users.ToList()
                         .Find(x => x.userName == vm.userName && x.password == vm.password);

    if (user != null)
    {
        User user2 = DataLayer.Data.userWithInclude(user.ID);
        DataLayer.User = user2;

        if (user2.Cart == null)
        {
            user2.Cart = new Cart();
        }

        DataLayer.Data.SaveChanges();

        return RedirectToAction("Index");
    }
}

当我在登录的最后一行之前调试时,当我 hover 超过用户 object 时,购物车的项目所有变量都存在,但里面的 object 是 null。

在 SQL 服务器数据库中,数据存在所有详细信息。

怎么会这样?

您可以像这样重写获取用户 class。

public User GetUserWithInclude(int? userId)
{
    return DataLayer.Data.Users.Include(x => x.Cart)
                            .Include(x => x.Cart.shakes)
                            .Include(x => x.Cart.equipmentList)
                            .Include(x => x.orders)
                            .Include(m => m.menus)
                            .FirstOrDefault(x => x.ID == userId);
}

然后您的登录操作结果可能如下所示

public IActionResult LogInUser(User vm)
{
    if(Login(vm.userName, vm.password)){
        return RedirectToAction("Index");
    }
    // handle login failure
}

制作一个单独的登录方法

public bool Login(string userName, string password)
{
    User user = DataLayer.Data.Users.FirstOrDefault(x => x.userName == userName && x.password == password);
    if (user != null)
    {
        User user2 = DataLayer.Data.GetUserWithInclude(user.ID);
        DataLayer.User = user2;

        if (user2.Cart == null)
        {
            user2.Cart = new Cart();
        }

        DataLayer.Data.SaveChanges();
        return true;
    }
    return false;
}

如果这不起作用,您可以尝试在用户之后获取购物车并进行调试,如果那是 null,但我对您的外键和关系等了解不够,无法帮助您解决这个问题

我认为您必须使用ThenInclude()方法。 您可以从此处获取更多详细信息

例如:

public User GetUserWithInclude(int? userId)
  {
      return DataLayer.Data.Users.Include(x => x.Cart)                            
                        .ThenInclude(m=>m.shakes)
                        .Include(x=>x.Cart)
                        .ThenInclude(m => m.equipmentlist)
                        .Include(m=>m.Orders)
                        .Include(m => m.menus)
                        .FirstOrDefault(x => x.ID == userId);
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM