【问题标题】:The UPDATE statement conflicted with the FOREIGN KEY constraint error?UPDATE 语句与 FOREIGN KEY 约束错误冲突?
【发布时间】:2017-01-21 19:34:03
【问题描述】:

当我尝试在我的应用中更新用户个人资料时,我收到以下错误:

UPDATE 语句与 FOREIGN KEY 约束冲突 “FK_dbo.UserDetails_dbo.Companies_CompanyId”。冲突发生在 数据库“aspnet-eksp-20161223071733”,表“dbo.Companies”,列 '公司 ID'。该语句已终止。

虽然它可能看起来不言自明,但我不知道如何解决它并使我的代码正常工作。我对 EF 和整个平台都很陌生。

当然,我的模型中有一个外键,而且这个外键字段不是为空的,它有一个值。

这是模型:

public class UserDetails
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserDetailsId { get; set; }
    public byte[] ImageData { get; set; }
    [NotMapped]
    public HttpPostedFileBase UploadImage { get; set; }
    [NotMapped]
    public string ImageBase64 => System.Convert.ToBase64String(ImageData);
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string UserAddress { get; set; }
    public string UserCountry { get; set; }
    public string UserPostalCode { get; set; }
    public string UserPhoneNumber { get; set; }
    public int CompanyId { get; set; }
    public virtual Company Company { get; set; }
    public string identtyUserId { get; set; }

}

以及控制器方法:

public ActionResult Edit([Bind(Include = "UserDetailsId,ImageData,FirstName,LastName,UserAddress,UserCountry,UserPostalCode,UserPhoneNumber,CompanyId,identtyUserId")] UserDetails userDetails, HttpPostedFileBase UploadImage)
        {
            if (ModelState.IsValid)
            {
                byte[] buf = new byte[UploadImage.ContentLength];
                UploadImage.InputStream.Read(buf, 0, buf.Length);
                userDetails.ImageData = buf;

                db.Entry(userDetails).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");

            }
            //ViewBag.CompanyId = new SelectList(db.Companies, "CompanyId", "CompanyName", userDetails.CompanyId);
            return View(userDetails);
        }

在视图中,我可以更新除最后两个字段(在模型中)之外的所有内容,但我怀疑这是问题所在。

任何帮助将不胜感激。

【问题讨论】:

  • 发布编辑时,CompanyId 的值是多少?该值是否存在于您数据库的相应表中?似乎您向数据库发送了一条更新语句,其中包含 CompanyId 的值,该值在 Companies 表中不存在。
  • 正如我在问题中提到的,我不会更新此值。模型中最后两个字段的值是在用户注册时插入的,之后我不想更改它。
  • @RobertRoss 你能试试我的回答吗?我只是省略了所有只使用 FirstName 的属性,但请尝试查看异常是否消失
  • 似乎UserDetails在数据库中有一个名为Companies_CompanyId的列。检查它是否还有一列CompanyId。我怀疑该声明更新了CompanyId,而不是Companies_CompanyId。您还可以通过监视插入语句及其值来检查这一点。如果您看到这两列,我们应该尝试解决映射问题。

标签: c# asp.net-mvc entity-framework ef-code-first


【解决方案1】:

嗨,你能做到吗?请在你的 if 语句下替换这段代码。

      byte[] buf = new byte[UploadImage.ContentLength];
            UploadImage.InputStream.Read(buf, 0, buf.Length);
            userDetails.ImageData = buf;
     --- here first read the dataof edited userDetail get it from context and chage this object state to modified and thn save.
            var currentUserDetail =   db.UserDetails.FirstOrDefault(f=>f.UserDetailid= Id);
            currentUserDetail.FirstName= userDetails.userDetails;
            db.Entry(currentUserDetail).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");

【讨论】:

  • 这是一种变通方法。可能有用,但它本身并不能解决问题。小挑剔:不需要设置Modified 状态。
  • @GertArnold:谢谢你发现它很有用。我有同样的问题我没有找到任何解决方案我不是 ninja od EF 但我的理解是它与 EF 加载实体时的状态有关然后你向它们添加一些东西它会将它们视为一个新条目然后尝试创建插入声明,即使它已经存在。我相信这种情况是一样的。如果用户运行 sql server profiler,那么您将看到 insert 而不是 update 。
  • 您没有向currentUserDetail 添加任何内容,您只修改了它的属性。更改跟踪器会注意到这些更改。
  • @GertArnold 如果我没记错你是说我不需要更改状态来修改?我需要检查一下。也许你是对的,需要尝试一下:)谢谢
【解决方案2】:

您的UserDetails_dbo 表有一个名为Companies_CompanyId 的外键列。您正在向数据库发送一条更新的记录,一条UserDetails_dbo 记录,但Companies_CompanyId 的值在数据库中不存在。因此,您会收到该错误。

确保您发送的更新记录具有外键值,并确保该值存在于数据库中。

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    相关资源
    最近更新 更多