无法从 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。如果不迁移它。这解决了我的问题,而无需放入一堆绑定重定向。
我在使用 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
:
<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。如果不迁移它。这解决了我的问题,而无需放入一堆绑定重定向。