EF核心和继承转换

时间:2020-02-16 09:28:23

标签: c# entity-framework asp.net-core ef-core-3.0

我正在将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>

0 个答案:

没有答案