Mã này đã làm việc cho tôi trước đây nhưng tôi không chắc chắn nữa điều gì đã gây ra lỗi này. Đoán duy nhất của tôi là khi tôi cố gắng tạo một Player, Team Data đang được gửi trở lại bảng Team và nó cố gắng lặp lại nhưng vì TeamId là duy nhất do đó lỗi này.Nguyên nhân Câu lệnh INSERT xung đột với ràng buộc KEY NGOẠI HỐI là gì?
Lỗi
Câu lệnh INSERT mâu thuẫn với các ràng buộc khoá ngoại "FK_dbo.Players_dbo.Teams_TeamId". Xung đột xảy ra trong cơ sở dữ liệu "Web", bảng "dbo.Teams", cột 'TeamId'. Các tuyên bố này đã bị chấm dứt.
chơi
public class Player
{
...
...
[HiddenInput(DisplayValue = false)]
[ForeignKey("Team")]
public int TeamId { get; set; }
public virtual Team Team { get; set; }
...
}
Đội
public class Team
{
[Key]
[HiddenInput(DisplayValue = false)]
public int TeamId { get; set; }
....
public virtual ICollection<Player> Players { get; set; }
}
khiển
//
// 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);
}
Xem
<div class="editor-label">
@Html.LabelFor(model => model.TeamId, "Pick Your Team")
</div>
<div class="editor-field">
@Html.DropDownList("TeamId", String.Empty)
@Html.ValidationMessageFor(model => model.TeamId)
</div>
Làm thế nào có thể giải quyết lỗi này?
Cảm ơn bạn thân, bật ra rằng 'player.TeamId = 5;' là khóa. Tôi không biết làm thế nào tôi bỏ lỡ điều này. – Komengem
@ Floradu88 Bạn đang thực hiện một chuyến đi không cần thiết đến cơ sở dữ liệu chỉ để kiểm tra xem Người chơi có tồn tại hay không. Bạn đã biết nó tồn tại nếu bạn kiểm tra Mã trong mã. Bạn nên cập nhật điều này vì nó dẫn đến thực hành hiệu suất kém. –
@FeistyMango Đó là mã ban đầu của tôi, lý do tại sao tôi đang thực hiện chuyến đi đó đến cơ sở dữ liệu là vì 'Trình phát' là con của 'UserProfile' và tôi cần' UserId' cho' Trình phát' – Komengem