SQL Server C#、ASP.NET MVC、实体框架:用户.购物车项目为空

sqserrrh  于 2023-01-16  发布在  C#
关注(0)|答案(2)|浏览(112)

我正在使用ASP。NET MVC与实体框架。我有一个类,处理SQL称为DataLayer
DataLayer中有一个User对象。
我构建了一个函数,它包含购物车中的所有商品,并通过id返回用户,然后将数据层中的用户设置为找到的用户(这样它就可以登录)。
功能代码为:

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;
}

下面是登录函数的一个片段:

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");
    }
}

当我在登录的最后一行之前进行调试时,当我将鼠标悬停在用户对象上时,购物车的项目存在所有变量,但其中的对象为空。
在SQL Server数据库中,数据包含所有详细信息。
怎么可能呢?

voj3qocg

voj3qocg1#

您可以像这样重写get user类。

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,则进行调试,但我对您的外键和关系等了解不够,无法帮助您完成此操作

ruarlubt

ruarlubt2#

我认为你必须使用**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);
  }

相关问题