访问base属性时,DbContext覆盖DbSet属性getter

时间:2017-05-26 17:46:54

标签: c# entity-framework inheritance

我正在处理一个带有从EDMX文件生成的DbContext类的项目。我需要在某些情况下根据身份验证状态过滤一些记录,而不是重写代码以在从DbContext类接收记录后过滤记录我首先假设创建另一个继承自原始DbContext的类很简单然后重写getter和setter,然后使用新类。像这样:

public partial class AutogeneratedBaseClass : DbContext
{
    ...
    public virtual DbSet<Record> Records { get; set; }
    ...
}

public class ChildClass : AutogeneratedBaseClass
{
    ...
    public override DbSet<Record> Records
    {
        get {
            return (DbSet<Record>) base.Records.Where(...);
        }
        set {}
    }
}

这编译很好,但是当我运行它时,base为null并且调试产生“错误CS0175:使用关键字'base'在此上下文中无效。”

无论如何要做到这一点?或者我需要寻找其他解决方案吗?谢谢!

1 个答案:

答案 0 :(得分:1)

可能最好使用组合而非继承如下:

实施DbContext

public class MainDbContext : DbContext 
{
    public DbSet<Record> Records { get;set; }
}

然后实施过滤后的版本

public class FilteredDbContext 
{
    private readonly MainDbContext dbContext;

    public FilteredDbContext(MainDbContext dbContext) 
    {
        this.dbContext = dbContext;
    }

    public IQueryable<Record> Records 
    {
        get { return dbContext.Records.Where(...); }
    }
}

理想情况下,两者都应该有接口,因此不要直接依赖于具体的类。