EF Core и наследование отливок - PullRequest
3 голосов
/ 16 февраля 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...