2012-01-12 21 views
6

Quindi, ecco la mia situazione:Entity Framework, soft-cancellazione e query

Sono soft-eliminazione di alcune righe in una tabella, utilizzando una bandiera IsDeleted, in modo che una può mantenere una traccia dei miei dati archiviati. Lo faccio sovrascrivendo l'istruzione SaveChanges nel mio ObjectContext.

La domanda è: come posso selezionare solo la riga (s) che hanno IsDeleted == false, senza dover specificare && !IsDeleted in ogni query?

Esiste un modo per specificarlo direttamente nel mio contesto?

tkx!

+0

EF Codice-primo o Model-First? – StriplingWarrior

+0

Invece di Flag, usa una tabella. Per la tabella eliminata, il PK può essere lo stesso PK della tabella principale, con il PK a FK della tabella eliminata nella tabella principale. Se hai un record in cancellato, allora è cancellato, se non attivo. Quindi è solo un semplice join. Le prestazioni delle query saranno migliori rispetto all'utilizzo di un bit flag. –

+0

@JonRaynor: I database non sono la mia specialità, ma mi sembra che controllare un bit flag sia molto meno costoso di un join, soprattutto perché di solito ti interesserà sapere quali articoli * non sono * cancellati (e quindi non sono presenti nella tabella eliminata). Se il flag di bit danneggia le prestazioni delle query, preferirei un indice sulla creazione di una tabella completamente separata. – StriplingWarrior

risposta

7

Si potrebbe definire una vista sul vostro tavolo e query che vista invece:

CREATE VIEW dbo.ActiveData 
AS 
    SELECT (list of columns) 
    FROM dbo.YourTable 
    WHERE IsDeleted = 0 

E poi nel modello EDMX, leggere i dati dal punto di vista ActiveData invece della tabella di base.

6

Se si fa clic con il pulsante destro del mouse su EntitySet nel viewer del modello e si fa clic su "Table Mapping", è disponibile un'area in cui è possibile "aggiungere una condizione". Questo dovrebbe fare ciò che stai chiedendo, anche se potresti preferire l'utilizzo di una vista, come suggerito da marc_s.

+0

Il mapping condizionale è il modo corretto per andare in EF. L'utilizzo di view as @marc suggerito funziona ma richiederà ulteriori modifiche. –

+0

Come faresti il ​​mapping condizionale con code-first, senza un edmx fisico? – danludwig

+0

@olivehour: http://stackoverflow.com/questions/8161689/entity-framework-conditional-mapping-with-code-first – StriplingWarrior

1

Questa è una vecchia domanda ora, ma per tutti i nuovi venuti qui. A partire da EF 6 dovresti davvero usare gli intercettori per questo tipo di query. Inserisce una query all'interno della query SQL mentre viene eseguita e filtra i record in base al flag.

vedere quanto segue per maggiori informazioni:

Soft Deleting Entities using Interceptors