[英]In EF6, how to create a generic method to get entities using a common field/column
我很抱歉,如果一段时间后标题没有足够的启发性,我无法用一个短语来解释我的问题。
就像这样:我正在使用EF6,数据库优先方法。 我所有的实体都有一个ID和一个Enabled属性。 我的DAL上有EDMX文件,现在我需要设计业务层(对我来说是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() {
}
}
对于将管理我的Venue实体的课程。 我创建类而不是使用类似的东西
var venueManager = new EntityManager<Venue>();
因为这些类将具有一些专门的方法。 我希望你能理解我到目前为止所做的一切(并且能奏效)
现在,我的问题是每个实体都有两个公共字段:ID(int)和Enabled(bool)我将在按ID删除以及对Get和GetAll进行编码时使用它们,因为我必须仅获取具有Enabled = true的项目。 现在,我知道由于我创建了Manager类,因此我可以只使用c&p代码,但是我想知道,有没有一种方法可以在EntityManager类中对此进行编码,并让所有管理器继承该方法,但要使用具体方法类?
像这样:在EntityManager类中:
public TEntity Get(int id) {
return _set.Where(T.ID==id);
}
那基本上就是我想要的:一种在所有它们都重要的基类(EntityManager)(方法deletebyid,get和getall)上使用这些属性的方式,以使所有Manager类(示例中的ManagerVenue)都继承这些方法,这样我就不会必须一遍又一遍地写它们? (获得了约100个实体)
您应该为所有实体定义基类或接口,例如:
public class Entity {
public int Id { get; set; }
public bool Enabled { get; set; }
}
并在EntityManager
类中向TEntity添加通用约束,例如where TEntity : Entity
然后,您将可以在基类EntityManager
使用公共属性Id
和Enabled
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.