2012-12-22 12 views
5

Io uso MVC4 e l'entità framework 5 nel mio progetto e ho molte tabelle. Come regola del nostro progetto, non cancelliamo alcun record dal database, ogni record ha un campo isActive e se quel campo è falso, allora lo consideriamo cancellato. Volevo scrivere un metodo di estensione per ottenere record attivi e dopo un po 'googling ho scritto questo:È corretto utilizzare i metodi di estensione nel mio caso?

public static IQueryable<Company> GetAll(this IQueryable<Company> source) 
{ 
    return source.Where(p => p.isActive); 
} 

ora posso usare il mio metodo di estensione per ottenere solo i record attivi come

Context db = new Context(); 
db.Company.GetAll(); 

Ma diciamo che ho Ho più di 50 tabelle nel mio database, è un buon approccio per scrivere lo stesso metodo di estensione per ciascuna delle mie tabelle. C'è un modo migliore per scrivere un solo metodo di estensione GetAll() per tutte le nostre tabelle? In realtà non sono nemmeno sicuro se sia giusto usare i metodi di estensione per questa istanza?

Qualcuno potrebbe aiutarmi e mostrarmi nel modo giusto? Apprezzo se mi aiuti con esempi di codice.

risposta

1

Dipende da come si utilizza Entity Framework, se si dipende dal generatore normale (e penso che lo si faccia), il caso diventa più difficile e non ho mai avuto un case study simile. Ma, se usi un normale generatore di classi POCO, puoi usare una classe base chiamiamola CEntity che è una classe base per ciascuna delle tue altre classi (tabelle).

Siamo già arrivati? No, per continuare con questo, io preferisco usare il Pattern Repository, e si può fare quel repository generico (CEntity), ad esempio:

public class Repository<CEntity> where CEntity : class 
{ 
    public IQueryable<CEntity> GetAll() 
    { 
     return source.Where(p => p.isActive); 
    } 

} 

E questo è come usarlo:

Repository<Company> com = new Repository<Company>(); 
Repository<Employee> emp = new Repository<Employee>(); 

var coms = com.GetAll(); // will get all ACTIVE companies 
var emps = emp.GetAll(); // will get all ACTIVE employees 

Questo è fuori di testa, se hai avuto altri problemi, mettili come commenti, lieti di aiutarti.

+0

Grazie per la rapida risposta LordCover. Uso il primo approccio al database. EF5.x DbContextGenerator è un normale generatore di classi POCO? In caso contrario, dove posso trovare un normale generatore di classi POCO? A proposito, nel tuo esempio non esiste una definizione di "fonte". – cck

+0

Lo so, 'source' è solo l'Object Set che è la collezione di oggetti. –

+0

Ma come si dice che ha campo attivo? Il compilatore dà un errore come "no tale campo"? Credo di dover fare un casting in classe Company, ma non cambierà nulla, quindi dovrò farlo per tutti i miei tavoli ?? – cck

1

Proprio come un punto di interesse, questo è esattamente il modo a implementare i miei livelli di dati, e credo che la sua impressionante :)

Ho anche marmellata di un repository in mezzo pure ma il concetto generale dovrebbe funzionare con o senza.

Ecco alcuni esempi di codice funzionante su come utilizzo questo metodo nel mio blog per alcuni casi d'uso simili.

https://github.com/lukemcgregor/StaticVoid.Blog/blob/master/Blog/Data/Entities/Post/PostRepositoryExtensions.cs

ho scoperto che fa un po 'di codice piuttosto elegante, pur non limitando quello che si può fare troppo. Come ho detto, penso che questo metodo sia fantastico e raccomandi davvero il suo utilizzo.

+0

Grazie Luke per esempio al progetto. C'è una cosa che non ho capito (forse di più). La classe di contesto del database è creata per ogni repository oppure i repository condividono una classe di contesto del database (crea solo un contesto)? – cck

+0

Sì, suppongo che il mio esempio sia un po 'più complesso in quanto utilizzo un repository generico. Sotto c'è un DbContext (https://github.com/lukemcgregor/StaticVoid.Blog/blob/master/Blog/Data/BlogContext.cs), tuttavia puoi effettivamente fare lo stesso metodo di estensione senza usare un repository se funziona meglio per te estendendo IQueriable o IDbSet . –

Problemi correlati