2017-01-07 10 views
0

からの例外私は、データベース内の情報を更新するには、このコントローラーを持っている:同じタイプの別のエンティティがすでに同じプライマリキー値を持つため、タイプのエンティティをアタッチできませんでした。 Entity Frameworkの

とこのリポジトリクラスからエントリーを更新するには:

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

はidで車をゲット:

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はすでに同じidを持つojbectを所有しているように見えます。これがこの例外の背後にある理由かもしれません。 –

+0

ここで問題となるのは、1つのエンティティのみでModifiedを設定していることです。カーエンティティでも同じように設定しようとしましたか? –

+0

回答ありがとう!あなたが言ったことに取り組んでいますが、これはうまくいきます。エントリを作成しようとするとうまくいきますが、更新する必要があると思います。 { var car = db.GetCar(carId); newOwner.Cars.Add(car); } } –

答えて

0

問題が見つかりました。 「所有者」オブジェクトは、データベースからrecivedこのように、変更する必要があります。

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"); 
    } 
関連する問題