Entity Framework Core DbContext.RemoveRange и ограничения типа - PullRequest
0 голосов
/ 12 февраля 2019

Этот код вызывает исключение

System.InvalidOperationException: тип сущности 'List <..>' не найден.Убедитесь, что тип сущности был добавлен в модель.

private static void Update<T>(DbContext context, ICollection<T> existing, ICollection<T> updated)  // where T: class
{
      context.RemoveRange(existing); 
      updated.ToList().ForEach(existing.Add);
}

Однако при добавлении ограничения типа where T: class исключение не выдается.Почему это?У меня сложилось впечатление, что ограничения типа C # не влияют на поведение во время выполнения, как это.Обе версии компилируются нормально.

1 Ответ

0 голосов
/ 13 февраля 2019

Это не поведение во время выполнения, а разрешение перегрузки метода времени компиляции и ковариация:

context.RemoveRange(existing);

RemoveRange метод имеет две перегрузки:

RemoveRange(IEnumerable<object> entities)

и

RemoveRange(params object[] entities)

Наличие ограничения класса позволяет компилятору C # выбирать перегрузку с помощью IEnumerable<object> - поскольку ICollection<T> равно IEnumerable<T>, а IEnumerable<T> для ссылочного типа T ковариантно, следовательно, IEnumerable<object>.

Без ограничения класса единственными доступными параметрами является метод с аргументом params object[].И тут возникает один из недостатков / побочных эффектов / ловушек конструкции params object[] - каждый отдельный аргумент arg с типом, отличным от object[], обрабатывается как object и передается неявно как new object[] { arg }.

Итак, в первом случае фактический вызов -

context.RemoveRange((IEnumerable<object>)existing);

, а в последнем случае -

context.RemoveRange(new object[] { existing });

Другими словами, список передается как объект, что приводит крассматриваемое исключение времени выполнения.

То же самое относится ко всем другим Range методам класса DbContext - AddRange, UpdateRange и AttachRange.

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