2017-01-21 62 views
0

当我尝试更新我的应用程序用户配置文件我得到以下错误:UPDATE语句与FOREIGN KEY约束错误冲突?

The UPDATE statement conflicted with the FOREIGN KEY constraint "FK_dbo.UserDetails_dbo.Companies_CompanyId". The conflict occurred in database "aspnet-eksp-20161223071733", table "dbo.Companies", column 'CompanyId'. The statement has been terminated.

尽管它可能看起来自我explenatory我不知道如何解决它,使我的代码工作。我对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); 
     } 

在视图我可以更新的一切,但最后两个字段(模型),但我怀疑这是问题。

任何帮助将不胜感激。

+0

当您开始编辑时,CompanyId的价值是什么?此值是否存在于数据库的相应表中?看起来好像你向数据库发送了一个更新语句,该语句包含了公司表中不存在的CompanyId值。 – Christos

+0

正如我在问题中提到的,我不更新此值。当用户注册时插入模型的最后两个字段的值,并且我不想在之后对其进行更改。 –

+0

@RobertRoss可以请你回答我的问题。我只是省略了所有使用FirstName的属性,但请尝试查看异常是否消失 –

回答

0

嗨,你可以这样做。如果陈述,请替换您的代码。

 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"); 
+0

这是一种解决方法。可能有用,但它并没有解决问题本身。小挑剔:没有必要设置“修改”状态。 –

+0

@GertArnold:谢谢你发现它很有用。我有同样的问题,我没有找到任何解决方案我不是忍者od EF,但我所知道的是,它与EF加载实体时,然后你添加一些东西给他们,它对待他们一个新的条目,然后尝试创建插入声明,即使它已经存在。我相信这种情况是相同的。如果用户运行sql server profiler,那么你会看到插入而不是更新。 –

+0

你什么也不添加到'currentUserDetail',你只修改它的属性。更改跟踪器会注意到这些更改。 –

0

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

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

相关问题