首页 > 解决方案 > 如何解决 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 不再分配给票证

演示

https://imgur.com/QDerGP9

票务虚拟机

 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; }
    }

标签: c#entity-frameworkasp.net-core

解决方案


推荐阅读