Dans EF6, comment créer une méthode générique pour obtenir des entités utilisant un champ/une colonne commune

StackOverflow https://stackoverflow.com//questions/20008329

Question

Je suis désolé si le titre n'est pas assez éclairant après un certain temps, je n'ai pas pu trouver une phrase pour expliquer mon problème.

C'est comme ça:J'utilise EF6, première approche de base de données.Toutes mes entités ont un ID et une propriété Enabled.J'ai le fichier EDMX sur mon DAL et maintenant je dois concevoir la Business Layer (BLL pour moi).

Puisque j'aurai besoin de valider quelles données proviennent du DAL et sont visibles par le reste de l'application, j'ai décidé de créer une interface pour les opérateurs communs, de créer une classe de base qui l'implémente et d'avoir tous mes fournisseurs de tables de base de données\entités personnalisées. hériter de cela.

Si cela n'a pas de sens, voici ce que je fais :(Tout cela est en 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);
    }

Maintenant, la classe de base qui implémente les opérations courantes est la suivante :(édité pour plus de lisibilité et de concision)

 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);
        }


    }

Pour créer des gestionnaires qui accéderont réellement aux données et les rendront utilisables dans l'application, je prévois de faire quelque chose comme :

public class VenueManager: EntityManager<Venue> {
        public VenueManager():base()  {
        }
    }

Pour la classe qui gérera mon entité Venue.Je crée des classes au lieu d'utiliser quelque chose comme

var venueManager = new EntityManager<Venue>();

parce que ces classes auront des méthodes spécialisées.J'espère que vous pourrez comprendre ce que j'ai fait jusqu'à présent (et ça marche)

Maintenant, mon problème est que chaque entité a deux champs communs :Id (int) et activé (bool) Je dois les utiliser lors de la suppression par ID et lors du codage Get and Getall car je dois seulement obtenir des éléments qui ont activé = true.Maintenant, je sais que depuis que je crée des classes Manager, je pourrais simplement utiliser c&p le code, mais je me demandais s'il existe un moyen de coder cela dans la classe EntityManager et que tous les managers héritent de la méthode mais en utilisant le concret Des classes ?

quelque chose comme ça:Dans la classe EntityManager :

 public TEntity Get(int id) {
            return _set.Where(T.ID==id);
        }

C'est en gros ce que je veux :un moyen d'utiliser ces propriétés dans la classe de base (EntityManager) là où elles sont importantes (méthodes deletebyid, get et getall) de manière à ce que toutes les classes Manager (ManagerVenue dans l'exemple) héritent de ces méthodes afin que je n'aie pas à les écrire partout et plus?(j'ai une centaine d'entités)

Était-ce utile?

La solution

Vous devez définir une classe de base ou une interface pour toutes vos entités, quelque chose comme :

public class Entity {
    public int Id { get; set; }
    public bool Enabled { get; set; }
}

Et dans ton EntityManager la classe ajoute une contrainte générique à TEntity comme where TEntity : Entity

Vous pourrez alors utiliser les propriétés communes Id et Enabled à l'intérieur de votre classe de base EntityManager.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top