このコードを希望どおりに機能させる方法についてのアイデアが不足しています。以下に示すように、3つのモデルがあります。
UserProfile and Player
一対一の関係
UserProfile が最初に作成され、登録時に emailConfirmation が提供されたユーザーの電子メールに送信されます。アカウントを確認すると、最初のログイン ページにリダイレクトされます。認証された場合は、新しいプレーヤーの作成ページにリダイレクトされ、拡張プロファイルに関する詳細情報が提供されます。作成ページ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);
}
すべてが問題なく動作しますが、Creation にリンクTeam and Player
できません。UserProfile and Player
誰かが私が試すべきアイデアや別のアプローチを持っていますか? 前もって感謝します!