web-dev-qa-db-fra.com

Le type d'entité List`1 ne fait pas partie du modèle pour le contexte actuel

J'utilise Database First, EF 4.1

Je reçois "Le type d'entité List`1 ne fait pas partie du modèle pour le contexte actuel." erreur lors de la tentative de mise à jour d'un enregistrement à partir de ma vue Edition. 

L'erreur se produit à 

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

Voici mon modèle:

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; }
}

Voici mon contrôleur:

[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);
}

Je soupçonne que la boucle foreach n’est pas appropriée pour définir EntityState pour chaque élément d’une collection. 

Toute assistance sera grandement appréciée. 

20
Isaac Vallee

Essayez de changer votre boucle pour:

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

Vous appeliez db.Entry(properties), vous vouliez donc joindre la collection entière en une fois. DbContext.Entry (object) attend un objet unique , pas une collection.

52
Leniency

Merci, Clémence, pour la réponse. A bien fonctionné. 

Pour ce que ça vaut, je préfère garder mes assignations EntityState.Modified sur une seule ligne (comme j’en ai plusieurs), donc utilisé le LINQ suivant:

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

je pense que vous pouvez utiliser ce code pour résoudre ce problème. Parce que si vous l'utilisez, vous rencontrerez un autre problème. Maintenant, j'ai résolu mon problème et j'espère que cela fonctionnera pour vous

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

Je me suis retrouvé ici malgré l'utilisation du code EF. La solution au problème pour moi était simplement de ne pas essayer de passer une liste d'entités à la méthode d'insertion, mais de les insérer une à la fois

entityList.ForEach(context.Insert);

0
Ian Grainger