无法从 OrmLiteConfigExtensions (ServiceStack.OrmLite.Core) 加载 System.ComponentModel.Annotations

Cannot load System.ComponentModel.Annotations from OrmLiteConfigExtensions (ServiceStack.OrmLite.Core)

我在使用 ServiceStack.OrmLite.Core 包 (5.4.1) 并尝试通过以下操作获得 ModelDefinition (ServiceStack.OrmLite.ModelDefinition) 时出现 运行 时间错误:

var model = ModelDefinition<T>.Definition;

错误如下:

System.IO.FileLoadException: 'Could not load file or assembly 'System.ComponentModel.Annotations, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)'

我尝试安装 nuget System.ComponentModel.Annotations(4.5.0.0,因为 4.2.0.0 不可用)无济于事。 我也试过遇到System.IO.FileLoadException时提示,但是没有用。

该项目是一个 .Net Framework 4.7.1 项目,但 .Net Standard 项目包含在解决方案中,因此我需要 运行 ServiceStack.OrmLite 的 .Core 版本。

我已经在两个工作区(两台单独的机器)上尝试过此操作,(1) 如上所述,以及 (2) 解决方案中没有 .Net Standard 项目。 在 (2) 机器上,当 运行 使用 ServiceStack.OrmLite 的非核心版本时它可以工作,但是切换到 ServiceStack.OrmLite.Core 时会出现 运行 时间错误。

有没有人有什么想法?

为了重现这个问题,我解决了 ASP.NET Core Apps on the .NET Framework templates referencing the latest v5.4.1 MyGet packages 的另一个问题,其中 Tests .csproj 应该引用新的 ServiceStack.Kestrel.Core 包而不是 ServiceStack.Kestrel,i,e:

<PackageReference Include="ServiceStack.Kestrel.Core" Version="5.*" />

现已在所有 .Core 模板中更新。要在 MyGet 上访问最新的 v5.4.1 包,您需要清除 NuGet 包缓存:

$ nuget locals all -clear

然后使用新的 web .NET Core 工具安装最新的 web-corefix 项目:

$ dotnet tool install --global web

$ web new web-corefx WebCoreFx

然后我在 WebCoreFx.csproj:

中添加了对 OrmLite MySql 的引用
<PackageReference Include="ServiceStack.OrmLite.MySql.Core" Version="5.*" />

并更新 Startup.cs 以注册 MySql 提供商,从 table 简单 table 创建和 select 并访问其 ModelDefinition<T>.Definition API:

class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public override void Configure(Container container)
{
    SetConfig(new HostConfig {
        DefaultRedirectPath = "/metadata",
        DebugMode = AppSettings.Get(nameof(HostConfig.DebugMode), false)
    });

    container.Register<IDbConnectionFactory>(c => new OrmLiteConnectionFactory(
        "Server=localhost;Database=test;UID=root;Password=test;SslMode=none",
        MySqlDialect.Provider));

    using (var db = container.Resolve<IDbConnectionFactory>().OpenDbConnection())
    {
        db.DropAndCreateTable<Person>();

        db.Insert(new Person {Id = 1, Name = "Name"});

        var s = db.Select<Person>().Dump();
        s.PrintDump();
    }

    var model = ModelDefinition<Person>.Definition;
    model.Name.Print();
}

按预期工作并且 运行s 没有问题。

如果您仍然有问题,可以在 GitHub 上上传 MCVE 我可以 运行 在本地重现该问题。

最后我想通了…

事实证明,ServiceStack.OrmLite.MySql.Core 需要 System.ComponentModel.Annotations 版本 4.2.0.0,正如错误消息明确指出的那样。通常它可以安装等于或大于所需版本的版本,但在这种情况下 none 有效。出于某种原因,FX 中包含的最新版本似乎是 4.0.0.0(或者至少这是我包含它的程序集版本时得到的。)还有一个 nuget 安装版本 4.5.0.0,但结果是一样。

我不知道为什么它可以使用 ServiceStack.OrmLite.MySql 的 FX 版本开箱即用,但是当我像我一样使用 Core 版本时,如果没有以下修复,我无法避免这种情况:

在我的启动项目中,我需要添加一个程序集绑定,告诉 ServiceStack.OrmLite.MySql.Core System.ComponentModel.Annotations 版本 4.2.0.0“重定向”到 4.0.0.0(属于同一程序集)。它看起来像这样:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
        <assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.2.1.0" newVersion="4.0.0.0" />
     </dependentAssembly>
 </assemblyBinding>

我敢肯定有人可以解释这方面的细节,我不是他们中的一员,但 none不过……将它添加到启动项目 app.config 就可以了.

我遇到了这个问题,其他与 SqlClient 相关的问题不受支持。确保将常规 .net 应用设置为使用 PackageReference 而不是 packages.config。如果不迁移它。这解决了我的问题,而无需放入一堆绑定重定向。