无法从程序集“Microsoft.EntityFrameworkCore”加载类型“Microsoft.EntityFrameworkCore.Internal.SemanticVersionComparer”,

Ste*_*eve 15 c# sqlite entity-framework-core

我有一个使用 EF Core 的 ASP.NET Core 3.1 Web API 应用程序。这是我在类的ConfigureServices方法中的配置Startup

services.AddDbContext<ApplicationContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("AppConn")));
Run Code Online (Sandbox Code Playgroud)

上述配置已测试并适用于 SQL Server 数据库。

然后我在成功安装它的包后切换到使用 Sqlite。

services.AddDbContext<ApplicationContext>(options =>
     options.UseSqlite("Data Source=sqlitedemo.db"));
Run Code Online (Sandbox Code Playgroud)

但是当我尝试添加 EF 迁移时

add-migration initial -context ApplicationContext
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

System.Reflection.TargetInvocationException:调用的目标已抛出异常。

System.TypeLoadException: 无法从程序集“Microsoft.EntityFrameworkCore, Version=5.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60”中加载类型“Microsoft.EntityFrameworkCore.Internal.SemanticVersionComparer”。

在 Microsoft.EntityFrameworkCore.Design.OperationExecutor..ctor(IOOperationReportHandler reportHandler, IDictionary args)
--- 内部异常堆栈跟踪结束 ---
在 System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean 构造函数, Boolean wrapExceptions)
at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfoculture)
at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfoculture)
at System .Activator.CreateInstance(类型类型,BindingFlags bindingAttr,Binder binder,Object[] args,CultureInfo 文化,Object[] activationAttributes)
在 System.Activator.CreateInstance(Type type, Object[] args)
在 Microsoft.EntityFrameworkCore.Tools.ReflectionOperationExecutor..ctor(String assembly, String startupAssembly, String projectDir, String dataDirectory, String rootNamespace, String language)
在 Microsoft.EntityFrameworkCore.Tools.Commands.ProjectCommandBase.CreateExecutor()
在 Microsoft.EntityFrameworkCore.Tools .Commands.MigrationsAddCommand.Execute()
在 Microsoft.EntityFrameworkCore.Tools.Commands.CommandBase.<>c__DisplayClass0_0.b__0()
在 Microsoft.DotNet.Cli.CommandLine.CommandLineApplication.Execute(String[] args)
在 Microsoft.EntityFrameworkCore.Tools .Program.Main(String[] args)

调用的目标已抛出异常。

小智 17

请将您的实体框架核心 nuget 包更新到 3.1.10(或最新的 5.0.0)。它会解决你的问题。

  • 这个答案对我有所帮助,但有一个经验可以分享,在删除所有迁移并尝试添加“第一个”迁移后,Microsoft.EntityFrameworkCore.Tools 的版本突然从 5x 跳回到 3x。另外,检查 .csproj 文件。 (2认同)

Tia*_*ila 11

我在 .NET Core 3.1 项目中遇到了这个问题。我通过在启动项目中安装Microsoft.EntityFrameworkCore.Design包来修复它


小智 8

我安装了 EF Core 5 包,但没有安装,Microsoft.EntityFrameworkCore.Design一个包隐式引用旧版本 ( Microsoft.EntityFrameworkCore.Design 3.0.0)。

安装显式依赖Microsoft.EntityFrameworkCore.Design 5.x.x为我解决了这个问题。


小智 7

不要忘记,对于迁移,您必须在主 EntityFramework 项目和启动项目中安装软件包。

Microsoft.EntityFramework.Core
Microsoft.EntityFramework.Core.Design
Run Code Online (Sandbox Code Playgroud)


Ωme*_*Man 7

确保引用的每个项目都提取相同主要/次要版本的实体框架 nuget 包。


我将一个项目从 V3 升级到 V6,但没有将 EF Core nuget 包升级到 6。一个项目有 6 个,另一个项目有 3 个,当我执行update-database.


小智 5

当我的项目中的所有依赖项似乎都是正确的时,我遇到了类似的问题。但问题是,上下文位于解决方案中的一个项目中,而解决方案中的另一个项目是启动项目。该项目碰巧包含不同版本的 EFCore。

使用上下文的项目作为包管理器控制台中的启动项目为我解决了这个问题。

add-migration -startupproject myProjectWithTheMigration