是否可以使用每个具体类型继承的表或其他继承类型在Entity Framework中返回DbSet<BaseEntity>
形式的方法?
Teacher
和Student
继承自Person
。
DbSet<Teacher> Teachers;
DbSet<Student> Students;
DbSet<Person> GetGenericDbSet(int entityType)
{
if (entityType == 0)
{
return Teachers;
}
else
{
return Students;
}
}
编译错误:
无法隐式将
DbSet<Teacher>
类型转换为DbSet<Person>
答案 0 :(得分:1)
即使Teacher : Person
和Student : 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>();
}
}
但是这样做,您将失去所有实体框架缓存功能(Attach
,Find
等)