[英]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.