.net EntityFramework Core 6升级无法加载类型IAsyncQueryProvider

qgelzfjb  于 2023-04-08  发布在  .NET
关注(0)|答案(2)|浏览(141)

我已经将我的.NET Core 3.1应用程序更新到了.NET 6,其中一个步骤是将EntityFramework Core更新到6.0.2版本。
不幸的是,我的许多单元测试现在都失败了,异常是:
System.TypeLoadException:未能从程序集“Microsoft.EntityFrameworkCore,Version=6.0.2.0”加载类型“Microsoft.EntityFrameworkCore.Query.Internal.IAsyncQueryProvider”,
我真的不知道为什么会发生这种情况,我已经浏览了迁移指南(https://learn.microsoft.com/en-us/aspnet/core/migration/31-to-60?view=aspnetcore-6.0&tabs=visual-studio),并没有看到任何类似的内容。
下面是一个失败的单元测试的示例:

[TestMethod]
public async Task IsPrivatKundeAsync_WithMatchingCriteria_ReturnsTrue()
{
    var data = new[] {
        new MyEntity { Partnernr = "1", Geburtstag = new DateTime(2000, 1, 1), Plz = "8000" },
        new MyEntity { Partnernr = "2", Geburtstag = new DateTime(2001, 2, 2), Plz = "8001" },
        new MyEntity { Partnernr = "3", Geburtstag = new DateTime(2002, 3, 3), Plz = "8002" },
    };

    var builder = new DbContextOptionsBuilder<MyDbContext>().UseInMemoryDatabase(Guid.NewGuid().ToString());
    var db = new Mock<MyDbContext>(builder.Options);
    db.Setup(x => x.MyEntity).Returns(data.AsQueryable().BuildMockDbSet().Object);

    IPartner partner = new Partner(db.Object);
    var result = await partner.IsPrivatKundeAsync(data[1].Partnernr, data[1].Geburtstag.Value, data[1].Plz);

    Assert.IsTrue(result);
}

这些测试在更新之前一直有效。
谢谢你的任何见解:-)

jexiocij

jexiocij1#

问题很可能出在您用于测试的某个包中。
EF Core在EF Core版本3到5之间将这个类的命名空间从Microsoft.EntityFrameworkCore.Query.Internal.IAsyncQueryProvider更改为Microsoft.EntityFrameworkCore.Query.IAsyncQueryProvider,这意味着其中一个测试包需要更新或更改。在我的情况下,它是MockQueryable.Moq包。

vhipe2zx

vhipe2zx2#

只是为了让这对其他人有帮助。我们升级到了.NET 6.0,但没有升级AutoMapper库。AutoMapper是8.1.1,AutoMapper.Extensions.Microsoft.DependencyInjection是6.0.0。我们得到了同样的错误。经过调试,原来原因是因为我们的API加载了引用Microsoft的EntityFrameworkCore版本2.0的EntityFrameworkCore.CommonTools版本2.0.2。2,但由于.NET 6.0升级,该进程正在加载Microsoft.EntityFrameworkCore版本6.0.14,当AutoMapper尝试查找Microsoft.EntityFrameworkCore版本2.0.2的所有DefinedTypes时,其中之一是Microsoft.EntityFrameworkCore.Query.Internal.IAsyncQueryProvider,它本应在Microsoft.EntityFrameworkCore2.0.2版中,但现在已移至6.0中的不同名称空间。14.
解决方法是不加载类型,而是执行此操作

services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies().Where(x
=> string.Equals(x.GetName().Name, "EntityFrameworkCore.CommonTools") == false));

相关问题