我在使用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 nne n's可用)无用。我还尝试了在遇到System.io.fileloadexception时建议的各种修复程序,但没有任何作用。
该项目是一个.NET Framework 4.7.1项目,但解决方案中包括.NET标准项目,因此我需要运行.core版本的ServicEstack.ormlite。
我已经在上述两个工作区(两台单独的机器),(1)和(2)的情况下尝试了此操作,而解决方案中没有.NET标准项目。在运行ServiceStack.OrmLite
的非核心版本时,在(2)机器上可以工作,但是切换到ServiceStack.OrmLite.Core
发生运行时错误。
有人有任何想法吗?
最终我弄清楚了……
事实证明ServiceStack.OrmLite.MySql.Core
需要System.ComponentModel.Annotations
版本4.2.0.0,因为错误消息明确指出。通常,它可以安装等于或更大的版本,但在这种情况下,这些版本均无效。出于某种原因,FX中包含的最新版本为4.0.0.0(或者至少是当我包含它的汇编版本时得到的。)也有一个Nuget安装版本4.5.0.0,但结果是相同。
我不知道为什么它使用ServiceStack.OrmLite.MySql
的FX版本开箱即用,但是当我像我一样使用核心版本时,我没有找到没有以下修复的方法来避免这种情况:
在我的启动项目中,我需要添加一个汇编绑定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>
我敢肯定,那里有人可以解释有关此的细节,但我不是其中一个,而是……将其添加到启动Projects app.config会做技巧。
在试图重复此事时,我在.NET框架模板上使用ASP.NET核心应用程序解决了一个不同的问题.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核心工具安装最新的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提供商,从表简单表中创建并选择其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();
}
可以按预期运行并无问题运行。
如果您仍然有问题,您是否可以在GitHub上上传MCVE,我可以在本地运行以重复此问题。
我有这个问题,而其他与不支持的SQLCLCLIENT相关的问题。确保将常规.NET应用程序设置为使用PackageReference而不是packages.config。如果不迁移。这解决了我的问题,而不必放入一堆绑定的重定向。