c# - 如何解决 INSERT 语句与 FOREIGN KEY 约束“FK_Tickets_AspNetUsers_UserId”冲突
问题描述
我需要帮助,因为我被困在这里,我不知道我在哪里犯了错误,我的代码有什么问题。当我想更新我的数据库中的记录时,我得到了这种错误
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Tickets_AspNetUsers_UserId". The conflict occurred in database "VmSTicketing", table "dbo.AspNetUsers", column 'Id'. The statement has been terminated
.
由于我环顾谷歌和论坛,我无法弄清楚这里有什么问题。无论我尝试什么,我总是回到同一点。
到目前为止,这是我的模型
public class Ticket
{
[Key]
public int Id { get; set; }
[Display(Name = "Opis")]
public string Description { get; set; }
[Display(Name = "Datum i vrijeme slanja")]
public string DateAndTime { get; set; } = DateTime.Now.ToString("dd/MM/yyyy HH:mm");
[Display(Name = "Datum i vrijeme zavrsetka")]
public DateTime Answered { get; set; }
[Display(Name = "Vrsta tiketa")]
public int TicketTypeID { get; set; }
[ForeignKey("TicketTypeID")]
public virtual TicketType TicketType { get; set; }
public int UserId { get; set; }
[ForeignKey("UserId")]
public virtual ApplicationUser ApplicationUser { get; set; }
public int? ClientId { get; set; }
[ForeignKey("ClientId")]
public virtual Client Client { get; set; }
public string Status { get; set; } = TicketStatus.Otvoren.ToString();
}
这是我的控制器动作
public IActionResult Upsert(int? Id)
{
IEnumerable<TicketType> TTList = _unitOfwork.TicketType.GetAll();
TicketVM ticketVM = new()
{
Ticket = new Ticket(),
TicketTypeList = _unitOfwork.TicketType.GetAll().Select(i => new SelectListItem
{
Text = i.Name,
Value = i.Id.ToString()
}),
ApplicationUser = new ApplicationUser(),
Client = new Client()
};
if (Id == null)
{
return View(ticketVM);
}
ticketVM.Ticket = _unitOfwork.Ticket.Get(Id.GetValueOrDefault());
if (ticketVM.Ticket == null)
{
NotFound();
}
return View(ticketVM);
}
这是我的HttpPost
行为造成了问题
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Upsert(TicketVM ticketVM)
{
var userName = User.FindFirstValue(ClaimTypes.Email);
var user = HttpContext.User.Identity.Name;
if (ModelState.IsValid)
{
if (ticketVM.Ticket.Id == 0)
{
ticketVM.Ticket.ApplicationUser = _db.ApplicationUsers.FirstOrDefault(u => u.Email == userName);
ticketVM.Ticket.Status = TicketStatus.Otvoren.ToString();
_unitOfwork.Ticket.Add(ticketVM.Ticket);
}
else
{
ticketVM = new()
{
Ticket = new Ticket(),
TicketTypeList = _unitOfwork.TicketType.GetAll().Select(i => new SelectListItem
{
Text = i.Name,
Value = i.Id.ToString()
}),
ApplicationUser = new ApplicationUser(),
Client = new Client()
};
//ticketVM.Ticket.Status = ((TicketStatus)Convert.ToInt32(ticketVM.Ticket.Status)).ToString();
_unitOfwork.Ticket.Update(ticketVM.Ticket);
}
_unitOfwork.Save();
return RedirectToAction(nameof(Index));
}
//else
//{
// ticketVM.TicketTypeList = _unitOfwork.TicketType.GetAll().Select(i => new SelectListItem
// {
// Text = i.Name,
// Value = i.Id.ToString()
// });
// if (ticketVM.Ticket.Id != 0)
// {
// ticketVM.Ticket = _unitOfwork.Ticket.Get(ticketVM.Ticket.Id);
// }
//}
//_unitOfwork.Save();
return View(ticketVM);
}
到目前为止,我尝试改变我的模型
public int UserId { get; set; }
[ForeignKey("ApplicationUser ")]
public virtual ApplicationUser ApplicationUser { get; set; }
请大家做人,帮我解决这种错误,因为我花了一个小时和一个小时来弄清楚我在这里做错了什么。干杯!
更新
好的,所以。在@King King说问题出在 我在阻止if (ticketVM.Ticket.Id == 0)
之前移动 ticketVM.Ticket.ApplicationUser 之后if
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Upsert(TicketVM ticketVM)
{
var userName = User.FindFirstValue(ClaimTypes.Email);
var user = HttpContext.User.Identity.Name;
ticketVM.Ticket.ApplicationUser = _db.ApplicationUsers.FirstOrDefault(u => u.Email == userName);
if (ModelState.IsValid)
{
if (ticketVM.Ticket.Id == 0)
{
ticketVM.Ticket.Status = TicketStatus.Otvoren.ToString();
_unitOfwork.Ticket.Add(ticketVM.Ticket);
}
else
{
_unitOfwork.Ticket.Update(ticketVM.Ticket);
ticketVM.Ticket.Status = ((TicketStatus)Convert.ToInt32(ticketVM.Ticket.Status)).ToString();
}
_unitOfwork.Save();
return RedirectToAction(nameof(Index));
}
else
{
ticketVM.TicketTypeList = _unitOfwork.TicketType.GetAll().Select(i => new SelectListItem
{
Text = i.Name,
Value = i.Id.ToString()
});
if (ticketVM.Ticket.Id != 0)
{
ticketVM.Ticket = _unitOfwork.Ticket.Get(ticketVM.Ticket.Id);
}
}
return View(ticketVM);
}
现在冲突消失了,但ApplicationUser
在我以管理员身份登录并尝试从中更新后我POST A
仍然有问题USER A
自动更新 ApplicationUser 列并且用户 A 不再分配给票证
演示
票务虚拟机
public class TicketVM
{
public Ticket Ticket { get; set; }
public Client Client { get; set; }
public ApplicationUser ApplicationUser { get; set; }
public IEnumerable<SelectListItem> TicketTypeList { get; set; }
}
}
应用用户
public class ApplicationUser : IdentityUser<int>
{
[Required]
[Display(Name = "Ime")]
public string Name { get; set; }
[Required]
[Display(Name = "Adresa")]
public string StreetAddress { get; set; }
[Required]
[Display(Name = "Grad")]
public string City { get; set; }
[Required]
[Display(Name = "Postanski broj")]
public string PostalCode { get; set; }
public int? ClientId { get; set; }
[ForeignKey("ClientId")]
public Client Client { get; set; }
[NotMapped]
public string Role { get; set; }
[NotMapped]
public IEnumerable<SelectListItem> RoleList { get; set; }
[NotMapped]
public IEnumerable<SelectListItem> ClientList { get; set; }
}
解决方案
推荐阅读
- python - 如何使用 python 脚本从文件中获取特定数据?
- javascript - 在打字稿中的一组对象上展开运算符
- java - 从多个模块初始化静态变量时,它们在 Junit 中如何工作?
- javascript - 在 java 脚本中将 Unix 时间转换为其他 GMT
- python - 使滚动条在填充了超出画布尺寸的文本的画布内工作
- python - Pandas - 将两个数据帧中的最近事件与条件连接起来
- python - 我有一个数据框,我想为每一行申请循环,如果多列的条件将数据存储在新数据框中
- google-cloud-platform - 使用 Jinja2 从 GCP 部署管理器将用户名和密码设置为 Windows VM
- sqlite - (sqlite)如何选择某行上方和下方的行?不使用他们的 item_id
- javascript - 如果`typeof car`可以,为什么`instanceof car`不工作?有没有办法找到类的类型?