Объекты базы данных изменяются во время отладки - PullRequest
0 голосов
/ 17 января 2019

Я пишу проект под названием Социальная сеть. Это ASP.NET Core Web Application + шаблон веб-приложения (Model-View-Controller). Я написал возможность добавлять друзей, но она не работает.

После добавления друга я хочу отобразить страницу с его данными, но, похоже, у него нет друзей.

Но друзья будут отображаться, если вы выполните следующее (У пользователя нет друзей. Я вошел в базу данных. Друзья появились. Как?):

Screenshots

Модель пользователя:

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:

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

Понятия не имею, как это возможно.

1 Ответ

0 голосов
/ 17 января 2019

Это похоже на проблему отложенной загрузки в EF.

По сути, объекты не загружаются, пока вы не получите к ним доступ.

Попробуйте использовать Include("Friends") при загрузке пользователя методом UserProfile().

Это гарантирует, что связанные сущности всегда загружаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...