实体框架4.1 - 使用过滤器覆盖实体(DBSet)

时间:2012-01-17 07:23:55

标签: c# entity-framework entity-framework-4.1 ef-code-first

我正在尝试做一些相对容易的事情,但我不知道如何构建它。

我有一个Generated Entity,我想通过添加Linq Where语句来覆盖它。

此处为Context的部分内容:

public partial class MyEntities: DbContext
{
    public MyEntities()
        : base("name=MyEntities")
    {
    }    
    public DbSet<Assignee> Assignees { get; set; }
}

我已经创建了MyEntities的新部分并尝试了以下

public override DbSet<Assignee> Assignees 
{
    get
    {
        return this.Assignees.Where(z => z.IsActive == true);
    }
    set; 
}

但这会引发歧义错误(很明显)。

我该如何做到这一点?

谢谢

5 个答案:

答案 0 :(得分:11)

尝试使用不同的名称公开DbSet<Assignee>IQueryable<Assignee>

public partial class MyEntities: DbContext
{
    public MyEntities()
        : base("name=MyEntities")
    {
    }

    public DbSet<Assignee> AssigneesSet { get; set; }

    public IQueryable<Assignee> Assignees 
    {
        get
        {
            return AssigneesSet.Where(z => z.IsActive == true);
        }
    }
}

答案 1 :(得分:2)

您是否尝试过为模型中的表映射添加条件?右键单击edmx中的实体,然后选择“表映射”。然后“添加条件”。可能是一个更优雅的解决方案。

答案 2 :(得分:1)

public override DbSet<Assignee> Assignees 
{
    get
    {
        return base.Assignees.Where(z => z.IsActive == true);
    }
    set; 
}

这是你想要的吗?

答案 3 :(得分:0)

一个好的做法是在DAL文件夹中创建存储库类(使用您想要的名称)。 然后在那里做过滤器。 这是一个微软的教程:

http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

根据您想要的条件不能放置EF映射条件,原因如下: http://entityframework.codeplex.com/workitem/48

答案 4 :(得分:0)

我知道这是超级旧的,但另一种简单而优雅的方式,在不更改任何现有名称的情况下,使用new关键字隐藏原始成员,如下所示:

public new IQueryable<Assignee> Assignees 
{
    get
    {
        return base.Assignees.Where(z => z.IsActive == true);
    }
}

只是想为未来的访客分享,希望它有所帮助!