2017-01-07 2 views
0

У меня есть этот контроллер для обновления информации в базе данных:Прикрепление объекта типа не удалось, поскольку другой объект того же типа уже имеет такое же значение первичного ключа. Исключение из Entity Framework

и это обновить запись из репозитория класса:

public void UpdateOwner(Owner item) 
{    
     db.Entry(item).State = EntityState.Modified; 
     Save(); 
} 

Получить автомобиль по идентификатору:

public Car GetCar(int id) 
{   
    return db.Cars.Include(p => p.Owners).FirstOrDefault(x => x.CarId == id); 
} 

Модель автомобиля:

public class Car 
{ 
    [HiddenInput(DisplayValue = false)] 
    public int CarId { get; set; } 

    [Required] 
    [Display(Name = "Car model")] 
    public string Model { get; set; } 

    [Required] 
    [Display(Name = "Car mk.")] 
    public string Mk { get; set; } 

    [Required] 
    [Display(Name = "Car price")] 
    [DataType(DataType.Currency)] 
    public double Price { get; set; } 

    [Required] 
    [Display(Name = "Release Date")] 
    public int ReleaseDate { get; set; }   

    [Required] 
    [Display(Name = "Car type")] 
    public CarType Type { get; set; } 

    [HiddenInput(DisplayValue = false)] 
    public List<Owner> Owners { get; } 

    public Car() 
    { 
     Owners = new List<Owner>();   
    } 
} 

Владелец модели:

public class Owner 
{ 
    [HiddenInput(DisplayValue = false)] 
    public int OwnerId { get; set; } 

    [Required] 
    [Display(Name = "Client name")] 
    public string Name { get; set; } 

    [Required] 
    [Display(Name = "Client surname")] 
    public string Surname { get; set; } 

    [Required] 
    [Display(Name = "Client birthday")] 
    [DataType(DataType.Date)] 
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] 
    public DateTime Birthday { get; set; } 

    [Required] 
    [Display(Name = "Client experience(in years)")] 
    public int? ExperienceInYears { get; set; } 

    [Display(Name = "Select car")]  
    public List<Car> Cars { get; set; } 

    public Owner() 
    { 
     Cars = new List<Car>(); 
    } 
} 

Моя проблема в том, что это исключение из EF:

enter image description here

Может кто-нибудь помочь? Я провел несколько дней, пытаясь разрешить это и ничего ..

+0

Привет, Алексей, не могли бы вы рассказать о том, как данные о владельце и автомобиле связаны с базой данных? Для меня это похоже на то, когда вы возвращаете автомобиль из db, вы также включаете владельцев автомобиля. И после этого вы добавите этот автомобиль новому владельцу. Для меня это похоже, что у Car.Owners уже есть владелец ojbect с тем же идентификатором, и это может быть причиной этого исключения. –

+0

проблема заключается в том, что вы устанавливаете Modified только на одном объекте ... пытались ли вы установить его также на объекты Car как измененные? –

+0

Спасибо за ответы! Я работаю над этим, что вы сказали, но это отлично работает, когда я пытаюсь создать запись, я думаю, что это должно работать с обновлением, но нет. if (selectedCars! = Null) { foreach (int carId in selectedCars) { var car = db.GetCar (carId); новыйOwner.Cars.Add (автомобиль); } } –

ответ

0

Я нашел проблему. Объект «владелец» должен быть получен из базы данных, а затем изменен следующим образом:

public ActionResult EditOwner(Owner owner, int? [] selectedNewCars) 
    { 
     var newOwner = db.GetOwner(owner.OwnerId); 

     newOwner.Name = owner.Name; 
     newOwner.Surname = owner.Surname; 
     newOwner.Birthday = owner.Birthday; 
     newOwner.ExperienceInYears = owner.ExperienceInYears; 
     newOwner.OwnerId = owner.OwnerId; 

     newOwner.Cars.Clear(); 

     if (selectedNewCars != null) 
     {     
      foreach (int carId in selectedNewCars) 
      { 
       var car = db.GetCar(carId);      
       newOwner.Cars.Add(car); 
      }       
     } 

     db.UpdateOwner(newOwner); 

     return RedirectToAction("OwnersInfo"); 
    }