2010-03-16 616 views
1

J'ai une forme qui me renvoie une liste d'objets FlatSessieLINQ pour mettre à jour une liste <T> des objets à DB

à mon avis de modifier modifier un peu de FlatSessie et obtenir les retournés à ma méthode Post dans cette liste objet.

Dans mon DB j'ai Sessies, que je Automapper carte à l'aide de son FlatSessie et le dos

maintenant je ne peux pas obtenir LINQ pour faire la mise à jour à la DB pour moi.

le code:

[HttpPost] 
    public ActionResult Sessies(int id, int? modID, int? projID, string schooljaarparam, List<FlatSessie> sl) { 
     if (ModelState.IsValid) { 
      foreach (FlatSessie s in sl) { //i run over all FlatSessies which i get 
       Models.Sessies ses = Mapper.Map<FlatSessie, Sessies>(s); // i map them to the Sessies object 
       List<Sessies> origReeks = _db.Sessies.Where(p => p.Ses_ID == ses.Ses_ID).ToList(); //i get the original Session by ID. if there is a Session with that ID, if not (the ID will be 0) i do an Insert. if there is i want to do an Update. 

       if (origReeks.Count > 0) { 
        //it's an update 
        UpdateModel(origReeks.First(); //doesnt work 
        //_db.Sessies.Attach(ses, origReeks.First()); //doesnt work, gives me an error on used ID... 
        _db.SubmitChanges(); 
       } else { 
        //no sessies yet, add them, this works. 
        _db.Sessies.InsertOnSubmit(ses); 
        _db.SubmitChanges(); 
       } 
      } 
      TempData["okmsg"] = "De sessies zijn opgeslagen"; 
      return RedirectToAction("Index"); 
     } 

     //if not valid, i return the viewdata which i need. 

     Module m = _db.Modules.First(md => md.Mod_ID == modID.Value); 
     int antses = m.Mod_AantalSessies.Value; 

     List<List<SelectListItem>> lpllst = new List<List<SelectListItem>>(antses); 


     for (int i = 0; i < antses; i++) { 
      lpllst.Add(MvcApplication.lesplaatsList(schooljaarparam, -1)); 
     } 

     ViewData["lesplist"] = lpllst; 
     ViewData["lglist"] = MvcApplication.lesgeverList(); 

     return View(sl); 
    } 

Répondre

1

Il pourrait travailler pour fournir un prefix à UpdateModel (FlatSessie[n], où n est telle qu'elle correspond au nom d'entrée réelle de l'élément de modèle en question) afin qu'il sache quelles propriétés pour mapper sur l'objet, mais parce que vous obtenez une liste de ceux-ci, il pourrait ne pas. Avez-vous essayé de mettre à jour le modèle récupéré en utilisant directement les données de l'objet FlatSessie correspondant?

En outre, une fois que vous avez obtenu cette opération, vous pouvez effectuer un seul SubmitChanges pour tous les insertions/mises à jour (en dehors de la boucle) de sorte que l'ensemble de la soumission soit enveloppé dans une seule transaction. Cela rendra plus facile s'il y a des erreurs pour les corriger et les renvoyer - puisque vous n'aurez pas de modifications déjà commises causant d'autres erreurs potentielles.

+0

merci pour votre réponse, je vais essayer de le faire fonctionner. J'ai aussi un autre problème avec le même code, mais à son avis. vous pourriez vouloir le vérifier ici: http://stackoverflow.com/questions/2454319/model-binding-form-to-a-list-using-dropdown-binding-failing-1-way-for-dropdown il pourrait plus clair comment résoudre ce problème aussi de cette façon :) – Stefanvds

+0

AWESOME. Ça marche! mon updatemodel a juste dû être changé en: UpdateModel (origReeks.First(), "[" + counter + "]"); avec compteur étant un int incrémenté après chaque boucle. parce que c'est ainsi que le formcollection entre en jeu. MERCI !! – Stefanvds