繁体   English   中英

在EF6中,如何使用通用字段/列创建通用方法以获取实体

[英]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使用公共属性IdEnabled

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM