我的应用程序中有一个 AddFriend 操作,我将一个用户添加到另一个用户的朋友列表中,更新数据库中的数据,并保存更改,但这些更改稍后不可见。
使用的型号:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace SocialNetwork.Models
{
public class UserModel
{
public int Id { get; set; }
public string Name { get; set; }
public string Password { get; set; }
public string Sex { get; set; }
public List<UserModel> Friends { get; set; }
}
}
HomeController 类(在 AddFriend 操作中将用户添加为朋友,我将要添加为朋友的用户的 id 传递给该类):
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SocialNetwork.Models;
namespace SocialNetwork.Controllers
{
[Authorize]
public class HomeController : Controller
{
SocialNetworkContext db;
public HomeController(SocialNetworkContext context)
{
db = context;
}
public IActionResult Index()
{
var user = db.Users.First(u => u.Name == HttpContext.User.Identity.Name);
return Redirect($"~/Home/UserProfile/{user.Id}");
}
public IActionResult UserProfile(int Id)
{
ViewBag.is_auth_user = IsAuthorizedUser(Id);
var user = db.Users.First(u => u.Id == Id);
return View(user);
}
public IActionResult AddFriend(int Id)
{
var user = db.Users.First(u => u.Name == HttpContext.User.Identity.Name);
var new_friend = db.Users.First(u => u.Id == Id);
if (user.Friends == null)
{
user.Friends = new List<UserModel>();
}
user.Friends.Add(new_friend);
db.Users.Update(user);
db.SaveChanges();
return Redirect($"~/Home/UserProfile/{new_friend.Id}");
}
public IActionResult Users()
{
return View(db.Users.ToList());
}
[HttpGet]
public IActionResult Edit(int Id)
{
var user = db.Users.FirstOrDefault(u => u.Id == Id);
return View(user);
}
[HttpPost]
public IActionResult Edit(UserModel user)
{
db.Users.Update(user);
db.SaveChanges();
return Redirect($"~/Home/UserProfile/{user.Id}");
}
protected bool IsAuthorizedUser(int Id)
{
var user = db.Users.First(u => u.Name == HttpContext.User.Identity.Name);
if (user.Id == Id)
{
return true;
}
else
{
return false;
}
}
}
}
但是在调试的时候(如下图),如果我进入我的数据库,和当前用户的好友一起去列表,结果发现根本不是空的,他们会显示出来(如果我不进入数据库,不会显示用户):




这是 EF 中的延迟加载问题。实体在我访问它们之前不会加载。
Include("Friends")在加载用户时必须使用UserProfile(). 这将确保加载相关对象。也就是说,您需要替换此行:
var user = db.Users.First(u => u.Id == Id);对此:
var user = db.Users.Include("Friends").First(u => u.Id == Id);