5

我在我的项目中使用 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() 扩展方法?实际上我什至不确定在这个实例中使用扩展方法是否正确?

有人可以帮助我并告诉我正确的方法吗?如果您对代码示例提供帮助,我将不胜感激。

4

2 回答 2

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

这是我的头顶,如果您有任何其他问题,请将它们作为评论,很乐意提供帮助。

于 2012-12-22T16:03:22.270 回答
1

正如一个兴趣点,这正是我实现数据层的方式,我认为它很棒:)

我也在中间堵塞了一个存储库,但一般概念应该可以使用或不使用。

下面是一些工作代码示例,说明我如何在我的博客中使用此方法来处理一些类似的用例。

https://github.com/lukemcgregor/StaticVoid.Blog/blob/master/Blog/Data/Entities/Post/PostRepositoryExtensions.cs

我发现它可以编写一些非常优雅的代码,同时仍然不会过多地限制您可以做的事情。就像我说的,我认为这种方法很棒,真的推荐它的用法。

于 2012-12-23T04:39:15.880 回答