227 messaggi dal 07 ottobre 2004
Ciao a tutti

non riesco a eseguire una cancellazione banale, il mio obbiettivo è quello di cancellare tutti i record nella tabella che siano precedenti a 30 giorni fa.

il seguente codice non da nessun tipo di errore e al contempo non esegue la cancellazione.

sto usando SQL Server come DB e EF per la gestione dati.

ho provato ad eseguire altri tipi di cancellazione cambiando il criterio e funzionano :

hTd.Delete(t => t.TRA_USRNAM == "PIPPO"); // questa funziona.

credo di non aver capito come linq gestisce le date
 
using (UnitOfWork<MyContext> unitOfWorkDelete= new UnitOfWork<MyContext>())
                {
                    var hTd = unitOfWorkDelete.Repository<HIS_TRACE>();
                    var pippo = DateTime.Now.Subtract(new TimeSpan(30, 0, 0, 0)); // Valore calcolato corrattamte
                    // Non esegue la cancellazione
                    hTd.Delete(t => t.TRA_INPDAT < DateTime.Now.Subtract(new TimeSpan(30, 0, 0, 0)));
                    // Non esegue la cancellazione neanche in questo caso
                    //hTd.Delete(t => t.TRA_INPDAT < DbFunctions.AddMinutes(DateTime.Now,-30));
                    unitOfWorkDelete.Save();
                }


Potete aiutarmi

Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
non conosco l'implementazione del tuo UnitOfWork<T>. La Func che passi al metodo Delete viene poi usata nella Where di una query LINQ? Ricevi un errore o semplicemente le righe non vengono cancellate?

Nel frattempo considera quest'altra soluzione, che mi sembra la più semplice.
var soglia = DateTime.Now.AddDays(-30);
hTd.Delete(t => t.TRA_INPDAT < soglia);

Sembra una soluzione banale ma, l'assegnare il DateTime ad una variabile è una semplificazione per il provider LINQ, che così si troverà a lavorare con un semplice valore scalare, anziché con un'espressione C# che potrebbe non essere in grado di convertire in SQL.

ciao,
Moreno.

Enjoy learning and just keep making
227 messaggi dal 07 ottobre 2004
Ciao e grazie per la risposta

Ho già provato quest'alternativa ma non ha funzionato, il problema e che non da errore, ma non esegue il metodo save.

Ho provato altri criteri di cancellazione e praticamente funzionano tutti.

Ho provato anche un find con lo stesso criterio della data e funziona perfettamente.

Mi sembra uno di quei casi in cui la soluzione e una banalità nascosta.

Accetto volentieri altri suggerimenti

Ciao
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
puoi mostrare l'implementazione del metodo Delete?

Enjoy learning and just keep making
227 messaggi dal 07 ottobre 2004
BrightSoul ha scritto:
ciao,
puoi mostrare l'implementazione del metodo Delete?


Ciao scusa per il ritardo nella risposta.

Questi sono i metodi che implemento nei reposistory

    public void Delete(T entity)
        {
            dbContext.Set<T>().Remove(entity);
        }

        public void Delete(Expression<Func<T, bool>> match)
        {
            var objects = this.FindAll(match);

            foreach (var obj in objects)
                dbContext.Set(typeof(T)).Remove(obj);
        }


Grazie per l'aiuto
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
metti un breakpoint sull'istruzione:
var objects = this.FindAll(match);

e poi vai avanti passo-passo per verificare che FindAll abbia restituito tutti gli oggetti corrispondenti all'espressione che hai passato come parametro del Delete.

imbesi ha scritto:

non esegue il metodo save.

Nel codice che hai postato all'inizio ho visto che hai un apposito metodo Save
unitOfWorkDelete.Save();

Nella sua implementazione devi invocare dbContext.SaveChanges(), altrimenti gli oggetti che avevi rimosso dal dbContext non verranno effettivamente rimossi anche dal database.

ciao,
Moreno

Enjoy learning and just keep making
227 messaggi dal 07 ottobre 2004
questa e' l'implementazione del metodo save

public int Save()
        {
            try
            {
                return this.context.SaveChanges();
            }
            catch (DbEntityValidationException e)
            {
                StringBuilder sb = new StringBuilder();

                foreach (var result in e.EntityValidationErrors)
                {
                    sb.AppendLine(string.Format("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", result.Entry.Entity.GetType().Name, result.Entry.State));

                    foreach (var error in result.ValidationErrors)
                        sb.AppendLine(string.Format("Property: \"{0}\", Error: \"{1}\"", error.PropertyName, error.ErrorMessage));
                }
                throw new ApplicationException(sb.ToString(), e);
            }
        }


Ho fatto quello che mi hai suggerito e il metodo FindAll seleziona tutto quello che mi serve cancellare.. Ma quando entra nel ciclo per eseguire il comando "Remove" e come se si impallasse, ma non capisco perche?? da questo punto in poi non fa piu niente.

Ho controllato il db ma non ha cancellato nulla.

A questo punto non so piu cosa fare!! :(((

Ciao e grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,

imbesi ha scritto:

Ma quando entra nel ciclo per eseguire il comando "Remove" e come se si impallasse, ma non capisco perche??

Cioè, che cosa succede esattamente?
Quando debuggi passo-passo col tasto F10, che succede quando entri nel foreach, ti si blocca o ci mette un tempo esagerato?

Per il momento, prova a rimuovere l'oggetto così, vedi se cambia qualcosa (è equivalente a quello che avevi scritto):
dbContext.Entry(obj).State = EntityState.Deleted;


ciao,
Moreno
Modificato da BrightSoul il 29 agosto 2015 15.43 -

Enjoy learning and just keep making

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.