在EF6中,如何使用公共字段/列创建一个通用方法来获取实体

时间:2013-11-15 18:43:54

标签: c# linq entity-framework linq-to-entities entity-framework-6

我很抱歉,如果标题在一段时间后没有足够的启发,我就不能用短语来解释我的问题。

它是这样的: 我正在使用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个实体)

1 个答案:

答案 0 :(得分:1)

您应该为所有实体定义基类或接口,例如:

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

在您的EntityManager课程中,为where TEntity : Entity

添加一个通用约束给TEntity

然后,您就可以在基类Id中使用公共属性EnabledEntityManager