我很抱歉,如果标题在一段时间后没有足够的启发,我就不能用短语来解释我的问题。
它是这样的: 我正在使用EF6,数据库第一种方法。我的所有实体都有一个ID和一个Enabled属性。 我的DAL上有EDMX文件,现在我需要设计业务层(BLL for me)。
由于我需要验证哪些数据来自DAL并且对于应用程序的其余部分是可见的,我决定为公共运算符创建一个接口,创建一个实现它的基类并拥有我所有的自定义数据库表\ entities provider继承。
如果这没有意义,这就是我正在做的事情:(所有这一切都在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() {
}
}
对于将管理我的Venue实体的课程。我正在创建类而不是使用像
这样的东西var venueManager = new EntityManager<Venue>();
因为这些类会有一些专门的方法。 我希望你能理解到目前为止我做了什么(并且它有效)
现在,我的问题是每个实体都有两个公共字段:ID(int)和Enabled(bool) 我在使用id删除时以及编码Get和GetAll时使用这些,因为我必须这样做 获取Enabled = true的项目。现在,我知道,因为我正在创建管理器类,我可以只使用c&amp; p代码,但我想知道,有没有一种方法可以在EntityManager类中编写代码并让所有管理器继承该方法但是使用具体的课程?
这样的事情: 在EntityManager类中:
public TEntity Get(int id) {
return _set.Where(T.ID==id);
}
这基本上就是我想要的:一种在基类(EntityManager)中使用这些属性的方法(方法deletebyid,get和getall),所有Manager类(示例中的ManagerVenue)都继承这些方法我不必一遍又一遍地写出来吗? (有大约100个实体)
答案 0 :(得分:1)
您应该为所有实体定义基类或接口,例如:
public class Entity {
public int Id { get; set; }
public bool Enabled { get; set; }
}
在您的EntityManager
课程中,为where TEntity : Entity
然后,您就可以在基类Id
中使用公共属性Enabled
和EntityManager
。