48 messaggi dal 22 marzo 2012
Buon pomeriggio lista

sto impazzendo nell'effettuare l'update in modalità Entity Framework 6.

Il codice che uso è questo:
FEstInnolva _NLog = new FEstInnolva();

_NLog.CodiceFiscale = parameter.Request.CodiceFiscale;

var Ricerca = context.FEstInnolvas.SingleOrDefault(b => b.CodiceFiscale == parameter.Request.CodiceFiscale && b.DataFine == null);

if (Ricerca != null)
{
    _NLog.DataFine = DateTime.Now;
    context.FEstInnolvas.Attach(_NLog);
    context.Entry(_NLog).State = System.Data.Entity.EntityState.Modified;
}
else
{
    context.FEstInnolvas.Add(_NLog);
    context.Entry(_NLog).State = System.Data.Entity.EntityState.Added;
}

context.SaveChanges()


FEstInnolva é la tabella che ho importato con E.Framework.

Preciso che l'Add lo fa tranquillamente mentre quando vado a fare l'Attach mi da il seguente errore:

L'istruzione di aggiornamento, inserimento o eliminazione dell'archivio ha interessato un numero imprevisto di righe (0).

Non capisco se sto utilizzando il sistema giusto o se proprio è sbagliato tutto.

Spero in qualcuno di voi che mi dia una mano in quanto questo passaggio chiuderebbe il progetto che dovrei consegnare domani e che onestamente pensavo il meno difficoltoso del progetto.

Grazie

Luca Perini
Modificato da perini.luca il 18 luglio 2019 17:15 -

Perini Luca
871 messaggi dal 11 febbraio 2013
Credo sia un meccanismo di sicurezza per la concorrenza ottimistica

https://stackoverflow.com/questions/1836173/entity-framework-store-update-insert-or-delete-statement-affected-an-unexpec

https://stackoverflow.com/questions/6819813/solution-for-store-update-insert-or-delete-statement-affected-an-unexpected-n
48 messaggi dal 22 marzo 2012
Grazie jjchuck della risposta.

Nel frattempo ho fatto altre prove e ho capito come fare.

Bisogna aggiungere un campo alla tabella denominato

rowversion con un tipo dati timestamp (serve a E.Framework per effettuare verifiche)

questo tra le altre cose permette di effettuare il where direttamente
var a = db.tabella.where(s => s.nomecampo = parametrowhere).proprieta()


Dopo questo ho inserito li codice che è di una semplicità unica (come sempre andiamo a cercare chissà cosa e poi è li che ci chiama)
var Ricerca = context.FEstInnolvas.SingleOrDefault(b => b.CodiceFiscale == parameter.Request.CodiceFiscale && b.DataFine == null);
    if (Ricerca == mull) 
    {
        FEstInnolva _NLog = new FEstInnolva();

        _NLog.CodiceFiscale = parameter.Request.CodiceFiscale;
        context.FEstInnolvas.Add(_NLog);
        context.Entry(_NLog).State = System.Data.Entity.EntityState.Added;

    }
    else
    {
        var LogDB = context.FEstInnolvas.Where(r => r.CodiceFiscale == parameter.Request.CodiceFiscale && r.DataFine == null).First();
        LogDB.DataFine = DateTime.Now;
    }
    context.SaveChanges();


praticamente nell'INSERT (ADD) devo creare una istanza della struttura della tabella e riempirla, aggiungerla alla tabella e segnalare al context che sto per effettuare una ADD, nell'UPDATE devo fare la ricerca e compilare i campi che devo modificare direttamente sul risultato della ricerca (nel mio caso LogDB e poi in entrambi i casi eseguo un context.SaveChanges(); che chiude la connessione registrando i dati.

Spero serva anche ad altri in quanto ci ho perso quasi tre giorni di sbattimento di capa sullo spigolo di legno della mia scrivania

Cordiali saluti

Perini Luca

Perini Luca

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.