我在我的项目中使用MVC4和实体框架5,而且我有很多表。作为我们项目的规则,我们不会从数据库中删除任何记录,每个记录都有一个isActive字段,如果该字段为false,那么我们认为它已被删除。我想写一个扩展方法来获取活动记录,经过一些谷歌搜索,我写了这个:
public static IQueryable<Company> GetAll(this IQueryable<Company> source)
{
return source.Where(p => p.isActive);
}
现在我可以使用我的扩展方法只获取活动记录,如
Context db = new Context();
db.Company.GetAll();
但是,假设我的数据库中有50多个表,这是为每个表编写相同扩展方法的好方法。有没有更好的方法为我们所有的表编写一个GetAll()扩展方法?实际上我甚至不确定在这个实例中使用扩展方法是否正确?
有人可以帮助我并告诉我正确的方法吗?如果您帮助代码示例,我将不胜感激。
答案 0 :(得分:2)
这取决于你如何使用实体框架,如果你依赖于正常的生成器(我认为你这样做),你的情况会变得更难,而且我从未进行类似的案例研究。但是,如果你使用普通的POCO类生成器,你可以使用一个基类让它调用它CEntity
,它是你的每个其他类(表)的基类。
我们在吗?不,为了继续这一点,我更喜欢使用存储库模式,您可以使该存储库通用(CEntity),例如:
public class Repository<CEntity> where CEntity : class
{
public IQueryable<CEntity> GetAll()
{
return source.Where(p => p.isActive);
}
}
这是如何使用它:
Repository<Company> com = new Repository<Company>();
Repository<Employee> emp = new Repository<Employee>();
var coms = com.GetAll(); // will get all ACTIVE companies
var emps = emp.GetAll(); // will get all ACTIVE employees
如果您有任何其他问题,请将其作为评论,很高兴能提供帮助。
答案 1 :(得分:1)
正如我感兴趣的那样,这正是我实现数据层的方式,我认为它真棒:)
我也在中间堵塞了一个存储库,但是一般的概念应该有或没有。
这里有一些工作代码示例,说明我在博客中如何使用此方法来处理类似的用例。
我发现它制作了一些非常优雅的代码,同时仍然没有限制你可以做的太多。就像我说的,我认为这种方法很棒,并且真的推荐它的用法。