返回实体框架中的BaseEntity的DbSet

时间:2017-09-29 15:14:06

标签: c# entity-framework

是否可以使用每个具体类型继承的表或其他继承类型在Entity Framework中返回DbSet<BaseEntity>形式的方法?

TeacherStudent继承自Person

DbSet<Teacher> Teachers;
DbSet<Student> Students;

DbSet<Person> GetGenericDbSet(int entityType)
{
    if (entityType == 0)
    {
        return Teachers;
    }
    else
    {
        return Students;
    }
}

编译错误:

  

无法隐式将DbSet<Teacher>类型转换为DbSet<Person>

1 个答案:

答案 0 :(得分:1)

即使Teacher : PersonStudent : Person,您也无法将DbSet<Teacher>作为DbSet<Person>返回,因为IDbSet<T>不是covariant (看起来即使基接口IQueryable是协变的,它的子接口也不保留该属性)。

另一个解决方案是将方法的返回类型更改为IQueryable<Person>(因为IQueryable<T>是协变的,它将接受具有T子类的对象:

IQueryable<Person> GetPerson(int type)
{
    if (type == 0)
    {
        return Teachers.Cast<Person>();
    }
    else
    {
        return Students.Cast<Person>();
    }
}

但是这样做,您将失去所有实体框架缓存功能(AttachFind等)