2017-01-21 7 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

Это обход. Может быть полезно, но это не касается самой проблемы. Маленькая nitpick: нет необходимости устанавливать состояние «Модифицировано». –

+0

@GertArnold: Спасибо, что вы сочли это полезным. У меня была одна и та же проблема. Я не нашел решения, я не являюсь ни одним из EF, но я понимаю, что он связан с состоянием, когда EF загружает сущности, а затем вы добавляете к ним что-то новое, а затем пытаетесь создать вставку даже если он уже существует. Я уверен, что этот случай тот же. если пользователь запускает профилировщик sql server, то вместо обновления вы увидите вставку. –

+0

Вы ничего не добавляете к 'currentUserDetail', вы только изменяете его свойства. Отслеживание изменений заметит эти изменения. –

0

Ваш UserDetails_dbo таблица имеет столбец внешнего ключа с именем Companies_CompanyId. Вы отправляете обновленную запись в базу данных, запись UserDetails_dbo, но значение Companies_CompanyId в базе данных не существует. Поэтому вы получаете эту ошибку.

Убедитесь, что обновленная запись, которую вы отправляете, имеет значение для внешнего ключа и убедитесь, что значение существует в базе данных.