0

им жаль, если заголовок не просветит достаточно через некоторое время, я не мог прийти с фразой, чтобы объяснить мою проблему.В EF6, как создать общий метод для получения сущностей с использованием общего поля/столбца

Это примерно так: Я использую EF6, базовый подход к базе данных. Все мои объекты имеют идентификатор и свойство Enabled. У меня есть файл EDMX на моем DAL, и теперь мне нужно спроектировать Business Layer (BLL для меня).

Поскольку мне нужно будет проверить, какие данные поступают из DAL и видны остальной части приложения, я решил создать интерфейс для общих операторов, создать базовый класс, который реализует это, и иметь все мои пользовательские базы данных, таблицы \ сущности-провайдеры наследуют это.

Если то не имеет смысла, вот что я делаю: (Все это в 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); 
    } 

Теперь базовый класс, который реализует общие операции заключается в следующем: (отредактированный для удобства чтения и краткость)

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


    } 

Чтобы создать менеджер, которые на самом деле доступ к данным и сделать его пригодным для использования через приложение, я планирую делать что-то вроде:

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

Для класса, который будет управлять объектом моего объекта. Я создаю классы вместо того, чтобы использовать что-то вроде

var venueManager = new EntityManager<Venue>(); 

потому что эти классы будут иметь некоторые специализированные методы. Я надеюсь, что вы могли понять, что я сделал до сих пор (и это работает)

Теперь моя проблема заключается в том, что каждый объект имеет две общие поля: ID (INT) и Enabled (BOOL) Я использовать их, когда удаление по id и при кодировании Get и GetAll, потому что я должен только получить элементы с Enabled = true. Теперь я знаю, что, поскольку я создаю классы Manager, я мог бы просто использовать код cp, но мне было интересно, есть ли способ, чтобы я мог кодировать это в классе EntityManager и иметь все наследования унаследованного метода, но используя конкретные классы?

что-то вроде этого: В классе EntityManager:

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

Вот в основном то, что я хочу: способ использовать эти свойства в базовом классе (EntityManager), где они имеют значение (методы deletebyid, получить и GETALL) таким образом, чтобы все классы Manager (ManagerVenue в этом примере) наследовали эти методы, поэтому мне не придется писать их снова и снова? (Получил около 100 единиц)

+0

Это не работает? 'return _set.Where (x => x.ID == id) .FirstOrDefault();'? – bump

+0

Как @ andres.chort говорит, что вам нужно общее ограничение для вашего репозитория для вашего базового объекта. Но есть более мягкое удаление, чем это ..... http: //stackoverflow.com/a/18985828/150342 – Colin

ответ

1

Вы должны определить базовый класс или интерфейс для всех субъектов, что-то вроде:

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

И в вашем EntityManager классе добавить родовое ограничение на TEntity как where TEntity : Entity

Затем вы сможете использовать общие свойства Id и Enabled внутри вашего базового класса EntityManager.