2016-04-30 6 views
1

私は私のAsp.Net Mvcプロジェクトで次のモデルを持っています。 新しいオブジェクトが作成されると、OptionsとFotoの両方の新しいリストも作成されるので、オブジェクトに新しいオプションとピクチャを追加するだけです。新しいリストをインスタンス化する場所<T>?

public class VehicleModels 
{ 
    [Key] 
    public virtual int Id { get; set; } 
    public virtual string Naam { get; set; } 
    public virtual string Merk { get; set; } 
    public virtual string Brandstof { get; set; } 
    public virtual string Kleur { get; set; } 
    public virtual string TypeVanMerk { get; set; } 
    public virtual string TypeVanTransmissie { get; set; } 
    public virtual int Kilometerstand { get; set; } 
    public virtual int Bouwjaar { get; set; } 
    public virtual int AantalDeuren { get; set; } 
    public List<Optie> Options { get; set; } 
    public List<Foto> Fotos { get; set; } 

    public VehicleModels() 
    { 
     Options = new List<Optie>(); 
     Fotos = new List<Foto>(); 
    } 

} 

私は私のコントローラでこの編集

[HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Edit(int? id, HttpPostedFileBase upload) 
     { 
      if (id == null) 
      { 
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
      } 
      var VehicleToUpdate = db.VehicleModels.Find(id); 
      if (TryUpdateModel(VehicleToUpdate)) 
      { 
       try 
       { 
        if (upload != null && upload.ContentLength > 0) 
        { 
         if (VehicleToUpdate.Fotos.Any(f => f.VehicleModelsID == VehicleToUpdate.Id)) 
         { 
          db.Fotos.Remove(VehicleToUpdate.Fotos.First(f => f.VehicleModelsID == VehicleToUpdate.Id)); 
         } 

         var picture = new Foto 
         { 
          FotoNaam = System.IO.Path.GetFileName(upload.FileName), 
          ContentType = upload.ContentType 
         }; 
         using (var reader = new System.IO.BinaryReader(upload.InputStream)) 
         { 
          picture.Content = reader.ReadBytes(upload.ContentLength); 
         } 
         VehicleToUpdate.Fotos.Add(picture); 
        } 
        db.Entry(VehicleToUpdate).State = EntityState.Modified; 
        db.SaveChanges(); 

        return RedirectToAction("Index"); 
       } 
       catch (RetryLimitExceededException /* dex */) 
       { 
        //Log the error (uncomment dex variable name and add a line here to write a log. 
        ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator."); 
       } 
      } 
      return View(VehicleToUpdate); 

     } 

私の問題を持っている:

デバッグ中に私は自分の編集方法内のコード(var VehicleToUpdate = db.VehicleModels.Find(id);)のこの行は、新しいオブジェクトを作成することがわかりましたその新しいオブジェクトにプロパティをバインドしているように見えます。 しかしコンストラクタを渡すので、両方のリストはきれいに拭き取られます。

リストが空で、削除されず、新しいイメージも追加されないため、オブジェクトの画像を変更しようとすると、問題が発生します。私は2倍の同じイメージを持っています。

リストを別の場所にインスタンス化する必要がありますか? もしそうなら、適切な場所はどこですか?

サイドノート:私はthisチュートリアルに従ってプロジェクトに画像を追加しました。

+2

このモデルには何も意味がありません。このモデルに属するすべてのプロパティは 'virtual'、他のモデルを表すプロパティは存在しません。それは反対でなければならないようです。それとは別に、あなたがリンクしているチュートリアルでは、 'List'ではなく' ICollection'を使っています。ここでのやり方でコンストラクタのリストを初期化しません。オブジェクトが 'virtual'の場合は、手動コンストラクタの初期化は必要ありません。 – Claies

+0

@Claies 'virtual'を追加してコンストラクタからインスタンス化を削除すると、編集メソッドでトリックが実行されましたが、データベースを更新した後にSeedメソッドを実行したとき、オブジェクトを追加する前にリスト/これは、オブジェクトがまだEFを通して永続化されていないか、またはこれにもう1つの理由があるためですか? – Vahx

+0

@Claiesあなたのコメントを回答にする場合は、私は喜んでそれを受け入れるでしょう。 – Vahx

答えて

0

var VehicleToUpdate = db.VehicleModels.Find(id);で両方のリストをきれいにしないでください。それらは適切に配置する必要があります。

空きがなくなって空になっている場合は、データベースを確認してください。どちらのデータもそこにはありません。データが存在する場合、外部キーの制約が破られます。それを確認して修正してください。データベースを修正したら、プロジェクトのEntity Frameworkのedmxファイルでモデルを更新します。その後、Entity Frameworkはデータを適切に入力し、複製を追加する代わりにイメージが更新されます。

関連する問題