Entity Framework 4.1 - Override Entity (DBSet) with Filter

你离开我真会死。 提交于 2019-12-03 13:48:53

问题


I'm trying to do something which should be relatively easy, but i just dont know how to construct it.

I have a Generated Entity which I'd like to override by adding a Linq Where statement.

Herewith the partial for the Context :

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

I've created a new partial of MyEntities and tried the following

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

but this throws an ambiguity error (which is obvious).

How can I accomplish this?

Thanks


回答1:


Try exposing DbSet<Assignee> and IQueryable<Assignee> with different names

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);
        }
    }
}



回答2:


Have you tried adding a Condition to the Table Mapping in your model? Right click the entity in your edmx and choose "Table Mapping". Then "Add a condition". Probably a more elegant solution.




回答3:


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

This what you want?




回答4:


A good practice is to create repository classes in a DAL folder(use the name you want). Then do the filters there. Here is a microsoft tutorial for that:

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

Depending of the condition you want is not possible to put on EF mapping condition, here is the reason: http://entityframework.codeplex.com/workitem/48




回答5:


I know this is super old, but another simple and elegant way, without changing any existing names, is using the new keyword to hide the original member, like this:

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

Just wanted to share for any future visitors, hope it helps!



来源:https://stackoverflow.com/questions/8890987/entity-framework-4-1-override-entity-dbset-with-filter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!