web-dev-qa-db-ja.com

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

私はEF 4.1データベースファーストを使用しています

「エンティティタイプList`1は現在のコンテキストのモデルの一部ではありません」を取得しています。編集ビューからレコードを更新しようとするとエラーが発生します。

エラーが発生している

db.Entry(properties).State = EntityState.Modified;

これが私のモデルです:

public class Users
     {
     [Key]
     public int User_ID { get; set; }
     public string UserName { get; set; }

     [NotMapped]
     public IEnumerable<App_Properties> User_Properties
     {
          get { return Properties.Where(u => u.User_ID == User_ID); }
     }

     public virtual ICollection<App_Properties> Properties { get; set; }
}

public class App_Properties
{
     [Key]
     public int Prop_ID { get; set; }
     public int User_ID { get; set; }
     public int App_ID { get; set; }
     public string Key { get; set; }
     public string Value { get; set; }
     public DateTime DateEntered { get; set; }
     public DateTime DateModified { get; set; }

     [ForeignKey("User_ID")]
     public virtual Users Users { get; set; }
}

これが私のコントローラーです:

[HttpPost]
public ActionResult Edit(ICollection<App_Properties> properties)
{
     if (ModelState.IsValid)
     {
          foreach (var item in properties)
          {
               db.Entry(properties).State = EntityState.Modified;
          }

          db.SaveChanges();

          return RedirectToAction("Index");
     }

     return View(properties);
}

Foreachループは、ICollectionの各項目のEntityStateを設定するのに適切ではないようです。

どんな援助も大歓迎です。

24
Isaac Vallee

ループを次のように変更してみてください:

_foreach (var item in properties)
{
     db.Entry(item).State = EntityState.Modified;
}
_

db.Entry(properties)を呼び出していたため、コレクション全体を一度にアタッチしようとしました。 DbContext.Entry(object) 単一のオブジェクトが必要です 、コレクションではありません。

58
Leniency

回答をありがとう、リーニエンシー。よく働きました。

価値があるので、私はEntityState.Modified単一行の割り当て(私は複数あるため)のため、次のLINQを使用しました:

properties.ForEach(p => db.Entry(p).State = EntityState.Modified);
11
Jonathan

この問題にこのコードを使用できると思います。それを使用すると、別の問題が発生するからです。今、私は私の問題を修正し、それがあなたのためにうまくいくことを願っています

foreach (var item in properties)
{
  var oldEntity = FGetById(item.Id); // You can use find instead of FGetById
  context.Entry(oldEntity).CurrentValues.SetValues(item);
  Update(oldEntity);
}
0
malik

コードファーストEFを使用しているにもかかわらず、結局ここに到達しました。私にとっての問題の答えは、エンティティのリストをinsertメソッドに渡そうとするのではなく、一度に1つずつエンティティを挿入することでした。

entityList.ForEach(context.Insert);

0
Ian Grainger