Использование Linq для обновления списка <T>объектов в БД - PullRequest
1 голос
/ 16 марта 2010

У меня есть форма, которая возвращает мне список объектов FlatSessie

в моем редактируемом виде я редактирую несколько FlatSessie и возвращаю их моему методу Post в этом объекте List.

В моей БД у меня есть Sessies, которые я сопоставляю с помощью Automapper для FlatSessie и обратно

теперь я не могу заставить linq сделать обновление БД для меня.

код:

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

1 Ответ

1 голос
/ 16 марта 2010

Это может работать для предоставления префикса для UpdateModel (FlatSessie[n], где n таково, что оно совпадает с фактическим входным именем рассматриваемого элемента модели), чтобы оно знало, какие свойства сопоставлять объект, но, поскольку вы получаете список из них, это не может быть. Вы пытались обновить полученную модель, используя данные из соответствующего объекта FlatSessie напрямую?

Кроме того, как только вы включите это, вы можете захотеть сделать один SubmitChanges для всех вставок / обновлений (вне цикла), так что вы получите всю отправку, заключенную в одну транзакцию. Это облегчит работу при исправлении ошибок и повторной отправке, поскольку некоторые изменения уже не будут внесены, что приведет к дальнейшим потенциальным ошибкам.

...