DbContext在访问基本属性时重写DbSet属性获取器
问题描述:
我正在从一个EDMX文件生成一个具有DbContext类的项目。我需要在某些情况下根据身份验证状态过滤一些记录,而不是在从DbContext类接收到记录后重写代码以过滤记录我首先认为创建另一个继承自原始DbContext的类会很简单然后重写getter和setter,然后使用新类。事情是这样的:DbContext在访问基本属性时重写DbSet属性获取器
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 {}
}
}
编译没有问题,但是当我运行它的基础是零和调试收益率“错误CS0175:使用关键字‘基地’的无效在这种情况下”
有没有办法做到这一点?或者我需要寻找另一种解决方案?谢谢!
答
也许最好使用成分过继承,像这样:
落实的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(...); }
}
}
理想的情况下,也应该有两个接口,所以你不要直接依赖具体的课程。
'DbSet'是'IQueryable ',但反之亦然。因此'base.Records.Where(...)'是一个常规的'IQueryable '而不是'DbSet '。换句话说,你所尝试的是不可能的。 –