EF Core 2.1.4 FileLoadException System.ComponentModel.Annotations 4.2.0.0

时间:2018-10-09 08:45:27

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

将数据访问层从EF6升级到EF Core 2.1(.4)之后,我们遇到了FileLoadExceptionSystem.ComponentModel.Annotations, Version=4.2.0.0的问题,这很奇怪,因为EF Core 2.1.4使用{{1 }},解决方案中没有其他(我们可以找到)使用4.5.0.0

例如,在我们的解决方案中,我们具有以下项目结构:

DataAccess :(所有使用Microsoft.EntityFrameworkCore.SqlServer版本2.1.4的项目)
-模型(仅使用Scaffold-DbContext创建的模型)
-核心(抽象提供程序,持久性等)
-常见(DTO,具体提供者,持久性等)

主要解决方案:(没有安装EF Core软件包的项目)
-一些项目(A),其中包含对模型,核心,通用的项目引用

例如,即使项目A是一个简单的控制台应用程序,它仅从数据库中加载某些内容并将其显示在控制台中,当在DataAccess.Core中以抽象提供程序级别评估某些内容时,我们也会收到以下异常:

  

发生System.IO.FileLoadException HResult = 0x80131040   消息=无法加载文件或程序集'System.ComponentModel.Annotations,版本= 4.2.0.0,区域性=中性,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (来自HRESULT的异常:0x80131040)

奇怪的是,我们在任何地方都找不到4.2.0.0,甚至在Nuget中也跳过了该版本。
通过在我的System.ComponentModel.Annotations, Version=4.2.0.0文件中添加以下内容,尝试尝试以下问题的可接受答案:Could not load file or assembly '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的解决方案将是理想的选择

2 个答案:

答案 0 :(得分:0)

@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" />

并且您的问题消失的机会很合理。该绑定重定向可以自动应用于多个项目。测试哪个(一个或多个)引起您的问题。

答案 1 :(得分:0)

我有同样的问题。我已经通过实现以下帮助函数解决了它,该函数在开始时就重定向了程序集(在this answer中建议):

Route