2016-05-27 9 views
0

私はEntity Frameworkを使用していますが、Ninjaのインスタンスに属するリストからNinjqEquimentを削除しようとしています.Ninjasのリストを取得する際に、私は彼らがそこにいることを知っています。その後、忍者から機器を取り外し、変更を保存しようとします。次のエラーが発生する -EFモデルのリストからアイテムを削除する

エンティティタイプList`1は、現在の コンテキストのモデルの一部ではありません。

using (var db = new NinjaDbContext()) 
     { 
      //get ninjas with equipment included 
      var ninjas = GetAllNinjas(); 

      //get ninja 
      var ninja = (from n in ninjas 
         where n.Id == id 
         select n).FirstOrDefault(); 


      //get equipment 
      var eq = (from e in ninja.EquipmentOwned 
         where e.Id == removeEqId 
         select e).FirstOrDefault(); 

      //remove eq from ninja 
      ninja.EquipmentOwned.Remove(eq); 

      //Make sure entity knows EquipmentOwned has been modified 
      db.Entry(ninja.EquipmentOwned).State = EntityState.Modified; 

      //save ninja 
      db.SaveChanges(); 


     } 
+0

あなたは 'eq'の値を取得していますか?それはDBまたはデフォルトのものからですか? – Imad

+0

はい私は午前です。正しいIDの正しい項目です。私は正しいEntity Frameworkのやり方をしていますか? – Lautaro

+0

それはDBからです。 – Lautaro

答えて

0

ただ、この削除:

 //Make sure entity knows EquipmentOwned has been modified 
     db.Entry(ninja.EquipmentOwned).State = EntityState.Modified; 

これは、エラーが発生します。

EquipmentOwnedは、List<Equipment>である。 EFという用語にはEntryが含まれていないため、直接追跡されることはありません。

このコレクションからエンティティを削除すると、EFは、この特定の忍者とこの特定の機器との間には何の関係もないことがわかります。他の忍者がこの機器を使用する可能性があるため、データベースから機器を削除することはありません。

それを完全に削除するには、あなたがこのようなDbSet<>対応するから、この機器を削除する必要があります。

using (var db = new NinjaContext()) 
{ 
    //db.Equipment is a DbSet<Equipment> 
    //id is PrimaryKey of Equipment table 
    var eq = db.Equipment.Find(id); 
    db.Equipment.Remove(eq); 
    db.SaveChanges(); 
} 
+0

私はその時のエラーを理解しています。ありがとう、それは有用です。しかし、それは私の問題を解決しません。これは実際に私が前にコードを持っていた方法です。それは実行され、SaveChanges()を呼び出す前にアイテムがリストから削除されていることがわかります。しかし、それはDBから消えません。そしてエラーは出されません。 多分私はこれについて新しい質問をするべきです。 – Lautaro

+0

@Lautaro NavigationCollectionは関係であるが、 'DbSet'ではなく、DBから消えるべきではありません。 DBから削除するには、 'DbSet'から削除する必要があります。あなたはここでエラーがない、EFは意図したとおりに動作します。 – Szer

+0

OK!だから忍者モデルからアイテムを取り除くのは正しいEF方法ではないのですか? – Lautaro

関連する問題