им жаль, если заголовок не просветит достаточно через некоторое время, я не мог прийти с фразой, чтобы объяснить мою проблему.В 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 единиц)
Это не работает? 'return _set.Where (x => x.ID == id) .FirstOrDefault();'? – bump
Как @ andres.chort говорит, что вам нужно общее ограничение для вашего репозитория для вашего базового объекта. Но есть более мягкое удаление, чем это ..... http: //stackoverflow.com/a/18985828/150342 – Colin