17 messaggi dal 04 marzo 2013
Salve a tutti, sto studiando .net mvc 3 con EF..Sto facendo dei test ed ottengo un comportamento a me incomprensibile sul metodo di update. Faccio subito un esempio

[HttpPost]
        public ActionResult Edit(Album album)
        {
            if (ModelState.IsValid)
            {
                var oldAlbum = db.Albums.Single(m => m.albumID == album.albumID);
                
                
                album.thumb = oldAlbum.thumb;
                album.nomeThumb = oldAlbum.nomeThumb;

                
                db.SaveChanges();
                
                return RedirectToAction("Index");
            }
            ViewBag.genreID = new SelectList(db.Genres, "genreID", "description", album.genreID);
            return View(album);
        }


db è l'inizializzazione della mia classe DbContext; Il mio scopo è:
1 - Ricevere in input un oggetto di tipo Album inizializzato con i dati provenienti da un form
2 - Selezione da DB l'album con lo stesso id dell'album in input
3 - Vedere quali attributi sono stati modificati
4 - Salvare

Il codice così com'è non genera alcun errore però non effettua il salvataggio su db.
Se provo ad inserire subito prima di db.SaveChanges(); l'istruzione db.Entry(album).State = EntityState.Modified; mi viene generata un eccezione con descrizione
In ObjectStateManager esiste già un oggetto con la stessa chiave. ObjectStateManager non è in grado di tenere traccia di più oggetti con la stessa chiave.


Mi interesserebbe capire il motivo di quell'errore, come posso risolvere questo problema e il motivo.

Grazie mille in anticipo a tutti
383 messaggi dal 23 aprile 2007
provato a fare qualcosa del genere?

public ActionResult Edit(Album album)
{
if (ModelState.IsValid)
{
using(Context db = new Context()){
var oldAlbum = db.Albums.Single(m => m.albumID == album.albumID);


album.thumb = oldAlbum.thumb;
album.nomeThumb = oldAlbum.nomeThumb;



db.SaveChanges();
}
return RedirectToAction("Index");
}
ViewBag.genreID = new SelectList(db.Genres, "genreID", "description", album.genreID);
return View(album);
}

non vorrei che non riesca a "riconoscere" il contesto.
Modificato da historyX il 13 marzo 2013 13.52 -
17 messaggi dal 04 marzo 2013
Sinceramente non ho provato, ma l'errore generato quando inserisco l'istruzione db.Entry(album).State = EntityState.Modified;
mi lascia pensare che non solo riconosce il contesto ma che trova al suo interno anche un istanza dell'oggetto album
17 messaggi dal 04 marzo 2013
Infatti, ho appena provato la tua soluzione ma il risultato non cambia
383 messaggi dal 23 aprile 2007
solo una domanda se ho capito bene:
perchè usi: db.Entry(album).State = EntityState.Modified;?
una volta che hai recuperato l'entita dal contesto(tramite query) e modificato i parametri credo non sia necessario settare l'item allo stato modified(perchè lo fa l'oggetto in automatico credo), o almeno io non l'ho mai usato e non ho mai avuto grossi problemi.

Non vorrei che settandolo da codice lui duplichi l'entita e quanto chiami il savechanges anzicchè farti un solo update esegue una insert(dell'item duplicato quindi con id duplicata) ed un successivo update sull'item originario. (ma qui posso anche aver detto grosse ball.... :D)

Prova a toglierlo e vedi se cambia qualcosa.
Modificato da historyX il 13 marzo 2013 14.29 -
17 messaggi dal 04 marzo 2013
Perchè in realtà io non modifico l'oggetto che prelevo da database, per intenderci l'oggetto oldAlbum, ma modifico l'oggetto che viene passato come parametro; in ogni caso se tolgo quella istruzione non viene generato nessun errore ma semplicemente i dati non vengono aggiornati sul database
383 messaggi dal 23 aprile 2007
non mi è chiara una cosa, se vuoi modficare l'oggetto passato come parametro e non la riga del db, perchè chiami la savechanges?

se ho ben capito, stai cercando di aggiornare il dato visualizzato tramite l'oggetto(prendi l'espressione in senso molto lato) a partire dal dato residente sul db?
Modificato da historyX il 13 marzo 2013 14.34 -
17 messaggi dal 04 marzo 2013
No io voglio modificare la riga nel db. In pratica
1 - mi arriva l'oggetto album come parametro,
2 - io prelevo dal db l'album che ha lo stesso id dell'oggetto passato come parametro
3 - assegno alle propietà thumb e nomeThumb dell'oggetto passato come parametro il valore delle rispettive proprietà dell'oggetto prelevato dal db
4 - salvo tutto sul db

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.