我正在将EF Core 3.0与.NET Core 3.0一起使用。 我有一个由2个类继承的抽象数据库模型。每个人都有自己的桌子
因此,我们将类A作为抽象,类B和C继承了A。B和C在数据库中具有单独的表。它们是相同的,并且不添加任何额外字段。
现在是问题所在。
如果我尝试从数据库中获取B的列表,如下所示:
List<A> list = await context.Bs.ToListAsync();
这完全可以正常工作,以下内容也可以工作:
A a = context.Bs.FirstOrDefault();
但是,以下导致异常:
A a = await context.Bs.FirstOrDefaultAsync();
这是一个例外:
System.ArgumentException: Expression of type 'System.Threading.Tasks.Task`1[B]' cannot be used for return type 'System.Threading.Tasks.Task`1[A]'
我认为这是由于IList被定义为协变而System.Task不是这样的事实
那么,有没有办法解决此问题?据我所知,EF内核可以很好地支持继承,那么如果这是错误的,应该如何使用呢?
编辑:
我没有提到使问题更加复杂的重要方面。
在上面提供的示例中,我直接使用了context.Bs
,这简化了问题,因为我知道我正在使用B。
但是,在我的情况下,我有一个名为IUserManager的东西,用户管理器将动态解析DbSet,因此它是这样的:
IUserManager manager = GetDynamicVersion();
A a = await manager.UsersTable.FirstOrDefaultAsync();
在这种情况下,manager.UsersTable
将返回IQueryable<A>