Я использую 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>