EF Core 2.1.4 FileLoadException System.ComponentModel.Annotations 4.2.0.0 - PullRequest
0 голосов
/ 09 октября 2018

После обновления нашего уровня доступа к данным с EF6 до EF Core 2.1 (.4) у нас возникают проблемы с FileLoadException с System.ComponentModel.Annotations, Version=4.2.0.0, что странно, поскольку EF Core 2.1.4 использует 4.5.0.0, и ничего более(мы можем найти) в нашем решении использует 4.2.0.0.

Скажем, например, у нас есть следующая структура проекта в нашем решении:

DataAccess: (все проекты, использующие Microsoft.EntityFrameworkCore.SqlServer Версия 2.1.4)
- Модели (только моделисоздан с помощью Scaffold-DbContext)
- Core (абстрактные поставщики, персистенты и т. д.)
- общий (DTO, конкретные провайдеры, персистенты и т.Базовый пакет установлен)
- Некоторый проект (A) со ссылками на модели, Core, Common

Даже если проект A, например, простое консольное приложение, которое просто загружает что-то из базы данных и отображаетэто к консоли, когда что-то оценивается на уровне абстрактного провайдера в DataAccess.Core, мы получаем следующее исключение:

System.IO.FileLoadException произошло HResult = 0x80131040 Сообщение = Не удалось загрузить файл илисборка 'System.ComponentModel.Annotations, версия = 4.2.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a' или одна из ее зависимостейencies.Определение манифеста обнаруженной сборки не соответствует ссылке на сборку.(Исключение из HRESULT: 0x80131040)

Странно то, что мы нигде не можем найти System.ComponentModel.Annotations, Version=4.2.0.0, версия даже пропускается в Nuget.
Пытается принять ответ на этот вопрос: Не удалось загрузить файл или сборку 'System.ComponentModel.Annotations, Version = 4.1.0.0 , добавив следующее в мои .csproj файлы, кажется, решить проблему для некоторых проектов, но не для всех:

<PropertyGroup>
  <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
  <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>

В сгенерированных файлах DataAccess.Models.dll.config после построения единственной ссылки на System.ComponentModel.Annotations есть следующее:

<dependentAssembly>
  <assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.2.1.0" newVersion="4.2.1.0" />
</dependentAssembly>

Что не 4.2.0.0, но мыВы не уверены, где определяется этот новый номер версии.Это, вероятно, что-то незначительное, что мы пропустили или неправильно настроили, но некоторая помощь в поиске проблемы или указателей на то, где искать, была бы признательна.Решение, при котором нам не нужно добавлять AutoGenerateBindingRedirects к каждому .csproj файлу, было бы идеально

1 Ответ

0 голосов
/ 13 марта 2019

Содержимое из комментария @ JRB, отформатированное как ответ на удобочитаемость:

Это существующая проблема, которую Microsoft трудно исправить, возможно, из-за сотрудничества между несколькими группами разработчиков.Это происходит только в некоторых более сложных решениях.Решение очень простое.Измените значение bindingRedirect с

<bindingRedirect oldVersion="0.0.0.0-4.2.1.0" newVersion="4.2.1.0" />

на

<bindingRedirect oldVersion="0.0.0.0-4.2.1.0" newVersion="4.0.0.0" />

, и вероятность того, что ваша проблема исчезнет, ​​весьма высока.Эта привязка может быть автоматически применена в нескольких проектах.Проверяет, какие из них являются причиной вашей проблемы.

...