Добавить друзей ASP.NET Core EF

243
17 октября 2021, 01:10

3 час сижу и не знаю где промахнулся, в общем есть таблица в бд с юзерами, есть таблица друзей, в ней 2 поля - юзерИД и френдИД, сам функционал работает отлично, жму добавить друга, все идет как надо, в первое поле записывается непосредственно авторизованный пользователь, во второе айдишник добавляемого. Проблема в другом, когда я вывожу юзера и его друзей, в списке друзей прописываются айдишники его друзей, но все остальные параметры такие как юзерНейм, ластНейм итп устанавливаются с авторизованного пользователя... надеюсь объяснил доступно, погоним в код:

И так вот сам юзер:

public class User
    {
        public User()
        {
            UserFriends = new List<Friends>();
        }
        public int Id { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string LastName { get; set; }
        public List<Friends> UserFriends { get; set; }
    }

фреднс:

public class Friends
    {
        public int UserId { get; set; }
        public int FriendId { get; set; }
        public User User { get; set; }

    }

параметры в контексте дб:

public class DBUserContext : DbContext
    {
        public DbSet<User> Users { get; set; }
        public DBUserContext()
        {
            Database.EnsureCreated();
        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Friends>()
                .HasKey(t => new { t.UserId, t.FriendId });
            modelBuilder.Entity<Friends>()
                .HasOne(sc => sc.User)
                .WithMany(s => s.UserFriends)
                .HasForeignKey(sc => sc.FriendId);
            modelBuilder.Entity<Friends>()
                .HasOne(sc => sc.User)
                .WithMany(c => c.UserFriends)
                .HasForeignKey(sc => sc.UserId);
        }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=SocNW;Trusted_Connection=True;");
        }
    }

ну и метод добавления я думаю смысла писать нет, ведь он работает и все добавляется на свои места как положено, перейдем к проблеме. Для того, чтобы браузер не ругался на списки в списках (в прошлом проекте я с этим намучался, и тут сразу сделал выводы) я специально создал 2 модели представления UserViewModel и UserFriendsViewModel. вот код UserViewModel :

public class UserViewModel
    {
        public int Id { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string LastName { get; set; }
        public List<UserFriendsViewModel> Friends { get; set; }
    }

вот UserFriendsViewModel:

public class UserFriendsViewModel
    {
        public UserFriendsViewModel(Friends friends)
        {
            UserId = friends.UserId;
            FriendId = friends.FriendId;            
            UserName = friends.User.UserName;
            Password = friends.User.Password;
            LastName = friends.User.LastName;
            Id = friends.FriendId;
        }       
        public int UserId { get; set; }
        public int FriendId { get; set; }
        public int Id { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string LastName { get; set; }
    }

дальше идем к методу, который непосредственно и предоставляет мне нужного пользователя и его друзей:

[HttpGet, Route("getidenti"), Authorize(Roles = "Manager")]
        public IActionResult Get()
        {
            List<UserViewModel> user = db.Users.Include(x => x.UserFriends).ThenInclude(x => x.User).ToList().Select(c => new UserViewModel
            {
                Id = c.Id,
                UserName = c.UserName,
                Password = c.Password,
                LastName = c.LastName,
                Friends = c.UserFriends.Select(x => new UserFriendsViewModel(x)).ToList()
            }).ToList();
            UserViewModel userdb = user.FirstOrDefault(x => x.UserName == User.Identity.Name);

            return Ok(userdb);          
        }

Допустим у нас таблица френдс содержет следующие поля userId friendId 1 2 1 3 1 5 итд. в итоге прохожусь точкой останова и вижу что в return Ok(userdb); userdb.Friends содержит: userId - 1, friendId - 2, UserName - имя принадлежащее пользователя с айдишником userId, а не friendId. Надеюсь понятно описал проблему, подскажите где я споткнулся плиз, чувствую что в какой то мелочи ошибся, а в какой не могу понять;( П.С. во всем этом я использовал связь многие ко многим (many to many), это ведь приемлемо?

Answer 1

Сделал как показано ниже, и все заработало как надо

modelBuilder.Entity<Friends>()
                .HasKey(t => new { t.UserId, t.FriendId });           
            modelBuilder.Entity<Friends>()
                .HasOne(sc => sc.User)
                .WithMany(c => c.UserFriends)
                .HasForeignKey(sc => sc.FriendId);
            modelBuilder.Entity<Friends>()
                .HasOne(sc => sc.Friend)
                .WithMany(s => s.WhoAddMe)
                .HasForeignKey(sc => sc.FriendId);
READ ALSO
Помогите решить проблему Cannot modify header information - headers already sent by [дубликат]

Помогите решить проблему Cannot modify header information - headers already sent by [дубликат]

Хочу чтобы при заполнение формы, пароли и тд

147
Вывод массива php в список в зависимости от ключа

Вывод массива php в список в зависимости от ключа

Как вывести маркированный список из массива php в зависимости от ключей массиваКак вывести простой массив через foreach и забросить его в список...

246
Долгий ответ (вывод данных) ajax

Долгий ответ (вывод данных) ajax

еще плохо знаю js, прошу посмотреть участки кода js и php, и не плеваться, а помочь советом, подсказать где исправить ошибки, что бы ускорить работу...

72
Вывести в wordpress изображения имея их id

Вывести в wordpress изображения имея их id

У меня есть идентификаторы изображений

152