У меня закончились идеи о том, как заставить этот код работать так, как я хочу. У меня есть 3 модели, как указано ниже.
UserProfile and Player
отношение один к одному
Сначала создается UserProfile, при регистрации электронная почта Подтверждение отправляется на указанную электронную почту пользователя. Как только они подтвердят свою учетную запись, они перенаправляются на свою первую страницу входа в систему, а в случае аутентификации перенаправляются на страницу «Создать нового игрока», чтобы предоставить дополнительную информацию о своем расширенном профиле. На странице создания я хочу, чтобы UserId
вошедшего в систему пользователя было таким же, как и у создаваемого игрока. Когда я пробую код как есть, ответа нет, и ничего не добавляется и не сохраняется в базе данных.
Team and Player
отношение "один ко многим"
Довольно много пояснений, игрок должен принадлежать команде. Это делает перенаправление на действие «Редактировать» невозможным, как Player.TeamId != null
.
Профиль пользователя
[Table("UserProfile")]
public class UserProfile
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
public virtual Player Player { get; set; }
}
Команда
public class Team
{
[Key]
[HiddenInput(DisplayValue = false)]
public int TeamId { get; set; }
[Display(Name = "Full Name:")]
public string Name { get; set; }
public virtual ICollection<Player> Players { get; set; }
}
Игрок
public class Player
{
[Key]
[ForeignKey("UserProfile")]
[HiddenInput(DisplayValue = false)]
public int UserId { get; set; }
[Required]
[Display(Name = "Full name")]
public string FullName{ get; set; }
[Display(Name = "Team")]
public int TeamId { get; set; }
public virtual Team Team { get; set; }
public virtual UserProfile UserProfile { get; set; }
}
Сохранить проигрыватель
public void SavePlayer(Player player)
{
using (var context = new EFootballDb())
{
if (player.UserId == 0)
{
context.Players.Add(player);
}
else if (player.UserId > 0)
{
var currentPlayer = context.Players
.Single(t => t.UserId == player.UserId);
context.Entry(currentPlayer).CurrentValues.SetValues(player);
}
context.SaveChanges();
}
}
Создать действие
[HttpGet]
public ActionResult Create()
{
PopulateTeamsDropDownList();
return View();
}
[HttpPost]
public ActionResult Create(Player model)
{
try
{
if (ModelState.IsValid)
{
_dataSource.SavePlayer(model);
return RedirectToAction("Detail", "Team", new { id = model.TeamId });
}
}
catch (Exception)
{
ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
}
PopulateTeamsDropDownList(model.TeamId);
return View(model);
}
private void PopulateTeamsDropDownList(object selectedTeams = null)
{
var teamsQuery = from d in _dataSource.Teams
orderby d.Name
select d;
ViewBag.TeamID = new SelectList(teamsQuery, "TeamId", "Name", selectedTeams);
}
Все прекрасно работает между Team and Player
, но я просто не могу подключить UserProfile and Player
к Creation. У кого-нибудь есть идеи или другой подход, который я должен попробовать? Заранее спасибо!