是什么原因INSERT语句与FOREIGN KEY约束冲突?
这段代码以前对我有用,但我不确定是什么导致了这个错误。 我唯一的猜测是,当我尝试创建一个播放器时,团队数据被发送回Team表并尝试复制,但由于TeamId是唯一的,因此这个错误。
错误
INSERT语句与FOREIGN KEY约束“FK_dbo.Players_dbo.Teams_TeamId”冲突。 冲突发生在数据库“Web”,表“dbo.Teams”,列’TeamId’中。 该语句已终止。
播放机
public class Player { ... ... [HiddenInput(DisplayValue = false)] [ForeignKey("Team")] public int TeamId { get; set; } public virtual Team Team { get; set; } ... }
球队
public class Team { [Key] [HiddenInput(DisplayValue = false)] public int TeamId { get; set; } .... public virtual ICollection Players { get; set; } }
调节器
// // GET: /Player/ [HttpGet] public ActionResult Create() { PopulateTeamsDropDownList(); return View(); } // // POST: /Player/ [HttpPost] public ActionResult Create(Player model) { if (ModelState.IsValid) { using (var db = new EfDb()) { var userProfile = db.UserProfiles.Single(u => u.UserName == User.Identity.Name); if (userProfile != null) { var player = new Player { UserProfile = userProfile, .... .... }; db.Players.Add(player); db.SaveChanges(); } } } PopulateTeamsDropDownList(model.TeamId); return View(model); } private void PopulateTeamsDropDownList(object selectedTeams = null) { var teamsQuery = from d in _iService.Teams orderby d.Name select d; ViewBag.TeamID = new SelectList(teamsQuery, "TeamId", "Name", selectedTeams); }
视图
@Html.LabelFor(model => model.TeamId, "Pick Your Team") @Html.DropDownList("TeamId", String.Empty) @Html.ValidationMessageFor(model => model.TeamId)
怎么解决这个错误?
您应该尝试为您的玩家实体完成团队等实体。 特别是外键。
[HttpPost] public ActionResult Create(Player model) { if (ModelState.IsValid) { using (var db = new EfDb()) { //Since you have the username cached, you can check the local EF cache for the object before hitting the db. //var userProfile = db.UserProfiles.Single(u => u.UserName == User.Identity.Name); var userProfile = db.UserProfiles.Local.SingleOrDefault(u => u.UserName == User.Identity.Name) ?? db.UserProfiles.SingleOrDefault(u => u.UserName == User.Identity.Name); if (userProfile != null) { var player = new Player { UserProfile = userProfile, .... .... }; player.TeamId = 5; db.Players.Add(player); db.SaveChanges(); } } } PopulateTeamsDropDownList(model.TeamId); return View(model); }
并确保您的视图中的Dropdown是必需的,并将正确的值发送到post方法。
这背后的原因是当您在child
表上插入记录时, parent
表上的引用列的值尚不存在。
请考虑以下情形:
// PARENT TABLE CREATE TABLE TableA ( ID INT PRIMARY KEY ); // CHILD TABLE CREATE TABLE TableB ( ID INT PRIMARY KEY, TableA_ID INT, CONSTRAINT tb_FK FOREIGN KEY (TableA_ID) REFERENCES TableA(ID) ); // RECORDS OF PARENT TABLE INSERT INTO TableA (ID) VALUES (1); INSERT INTO TableA (ID) VALUES (2); // RECORDS OF CHILD TABLE INSERT INTO TableB (ID, TableA_ID) VALUES (1,1); INSERT INTO TableB (ID, TableA_ID) VALUES (2,1); INSERT INTO TableB (ID, TableA_ID) VALUES (3,2);
如果执行上述语句,则不会失败,因为它们都不违反参照完整性规则。
尝试执行以下语句:
INSERT INTO TableB (ID, TableA_ID) VALUES (3,4);
它失败,因为在Table1.ID
上不存在4
是要插入的TableA_ID
的值。 外键保留了记录之间的引用完整性。