У меня закончились идеи о том, как заставить этот код работать так, как я этого хочу. У меня есть 3 модели, как указано ниже.как связать SimpleMembership UserProfile с расширенным профилем с внешним ключом?
UserProfile and Player
один-к-одному отношения
UserProfile создан первый, при регистрации emailConfirmation отправляется на адрес электронной почты пользователя, поставляемом. Как только они подтвердят свою учетную запись, они перенаправляются на свою первую страницу входа в систему, если они аутентифицированы, перенаправлены на страницу Создать новую страницу, чтобы предоставить дополнительную информацию об расширенном профиле. На странице создания я хочу, чтобы UserId
зарегистрированного пользователя был таким же, как и для создаваемого игрока. Когда я пытаюсь использовать код как есть, ответа нет и ничего не добавляется или сохраняется в базе данных.
Team and Player
один-ко-многим
Довольно много пояснений, игрок должен принадлежать к команде. Это делает перенаправление на действие «Редактировать» a «нет» как Player.TeamId != null
.
UserProfile
[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; }
}
Team
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; }
}
SavePlayer
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);
}
Все работает просто отлично bewteen Team and Player
но я просто не могу получить UserProfile and Player
соединить в Творении. У кого-нибудь есть идеи или другой подход, я должен попробовать? Заранее спасибо!
Это не работает для меня. Я попробовал несколько способов, но пока не повезло. Добавляет и сохраняет UserProfile и ничего больше – Komengem
Komenge. Когда UserProfile сохраняется и вы смотрите на структуру базы данных, выглядит ли она корректно с учетом отношения между вашим UserProfile и связанной таблицей? Кроме того, при попытке сохранить связанный объект вы получаете исключение? – JabberwockyDecompiler
До сих пор я могу сказать, что UserProfile и другие связанные таблицы членства обновляются. У меня нет столбца в UserProfile для хранения данных для Player, так как я получаю UserIfile UserProfile и передаю его в Player как внешний ключ. Я думаю, что 'WebSecurity.CurrentUserId' или любые связанные вызовы приближаются к нулю. Я думаю, что это имеет какое-то отношение к контексту, который я использую, который отличается от того, что использует WebSecurity. – Komengem