可以在DbSet中添加Where过滤器吗?

时间:2014-04-09 13:36:13

标签: asp.net-mvc entity-framework

我一直在使用EF6在ASP.NET MVC5中开发一个应用程序。但是,现在要求已经改变了。这意味着我的申请现在必须是多租户。为此,我在所有租户特定行中添加了一个额外的id字段。

但是现在我必须确保我的应用过滤此ID。最简单的解决方案是在我的Context中添加where语句,但我不知道这是否可行。我是否必须使用存储库或其他东西封装我的所有DbSet?或者在EF本身的某个地方有更简单的解决方案吗?

2 个答案:

答案 0 :(得分:2)

我会亲自将它包装在存储库中,因为你明确地想要抽象。

但是这样的事情也可以正常工作:

public class MyContext: DbContext{
    public IDbSet<MyEntity> MyEntities{get;set;}
    public IQueriable<MyEntity> MyNonDeletedEntities{
        get{
            return MyEntities.Where(e=>!e.IsDeleted);
        };
    }
}

答案 1 :(得分:0)

问题是陈旧的,尽管luke的答案解决了只读方案中的问题,但我发现有一个解决方案符合只读方案,以及插入,更新和删除方案,这一点很重要。 。具有需要较少代码重构的优点。因为没有必要创建新的DbSet,

为此,您应该使用EntityFramework拦截器,通过它们,您可以在EF管道中添加功能以满足您的需要。例如:要过滤包含IdTenant字段的表中的所有查询以及租户ID的值。

下面的文章详细介绍了如何实现用于读取,插入和更新的拦截器。 http://xabikos.com/2014/11/18/Create-a-multitenant-application-with-Entity-Framework-Code-First-Part-2/

这可以防止开发人员使用错误的DbSet,并解决插入,更新和删除案例。

拦截器存在于EF 6中,但不存在于EF Core中。对于EF Core中的这种情况,您可以使用QueryFilters。

相关问题