In EF6, come creare un metodo generico per ottenere entità utilizzando un campo / colonna comune
-
20-12-2019 - |
Domanda
Mi dispiace se il titolo non è abbastanza illuminante dopo un po 'non riuscivo a venire con una frase per spiegare il mio problema.
è come questo: Sto usando EF6, il primo approccio del database. Tutte le mie entità hanno un ID e una proprietà abilitata. Ho il file EDMX sul mio DAL e ora ho bisogno di progettare il livello aziendale (BLL per me).
Dal momento che dovrò convalidare quali dati provengono dal DAL ed è visibile al resto dell'app ho deciso di creare un'interfaccia per gli operatori comuni, creare una classe base che implementa e ha tutte le mie tabelle di database personalizzate \ I fornitori di entità ereditano.
Se questo non ha senso, ecco cosa sto facendo: (tutto questo è in BLL)
public interface IEntityManager<T> where T : class {
void Add(T e, bool commit=false);
void Delete(T e);
void DeleteByID(int id);
void Update(T e);
IQueryable<T> Search(Expression<Func<T, bool>> predicate);
IQueryable<T> GetAll();
T Get(int id);
}
.
Ora, la classe base che implementa le operazioni comuni è questa: (Modificata per leggibilità e brevità)
public class EntityManager<TEntity> : IDisposable, IEntityManager<TEntity> where TEntity : class {
private readonly DbContext _ctx;
private readonly DbSet<TEntity> _set;
public EntityManager() {
_ctx = new DomainModelFactory();
_set = _ctx.Set<TEntity>();
}
public void Add(TEntity e) {
_set.AddOrUpdate(e);
}
//other methods here
public TEntity Get(int id) {
return _set.Find(id);
}
}
.
Per creare manager che accederanno effettivamente ai dati e renderlo utilizzabile attraverso l'applicazione, sto pianificando di fare qualcosa come:
public class VenueManager: EntityManager<Venue> {
public VenueManager():base() {
}
}
.
per la classe che gestirà la mia vita dell'entità. Sto creando lezioni invece di usare qualcosa come
var venueManager = new EntityManager<Venue>();
.
Perché queste classi avranno alcuni metodi specializzati. Spero che tu potessi capire cosa ho fatto finora (e funziona)
Ora, il mio problema è che ogni entità ha due campi comuni: ID (INT) e abilitato (BOOL) Io sono per usarli quando si eliminano con ID e quando la codifica diventa e getall perché devo solo Ottieni oggetti che hanno abilitato= true. Ora so che dal momento che creerò lezioni di manager, potrei solo usare C & P il codice, ma mi stavo chiedendo, c'è un modo in cui posso codificare questa nella classe di EntityManager e avere tutti i manager ereditare il metodo ma usando il calcestruzzo Classi?
Qualcosa del genere: In EntityManager Class:
public TEntity Get(int id) {
return _set.Where(T.ID==id);
}
.
questo è fondamentalmente quello che voglio: un modo per utilizzare queste proprietà alla classe base (EntityManager) in cui importa (metodi DeletebyID, ottenere e getall) in un modo che tutte le classi di gestore (Gestorevvenue nell'esempio) ereditano questi metodi così che non dovrò scriverli dappertutto? (ha circa 100 entità)
Soluzione
Dovresti definire una classe base o un'interfaccia per tutte le tue entità, qualcosa del genere come:
public class Entity {
public int Id { get; set; }
public bool Enabled { get; set; }
}
.
E nella tua classe EntityManager
aggiungere un vincolo generico a tentatività come where TEntity : Entity
Allora sarai in grado di utilizzare le proprietà comuni Id
e Enabled
all'interno della classe base EntityManager
.