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), это ведь приемлемо?
Сделал как показано ниже, и все заработало как надо
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);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Хочу чтобы при заполнение формы, пароли и тд
Как вывести маркированный список из массива php в зависимости от ключей массиваКак вывести простой массив через foreach и забросить его в список...
еще плохо знаю js, прошу посмотреть участки кода js и php, и не плеваться, а помочь советом, подсказать где исправить ошибки, что бы ускорить работу...