【问题标题】:ServiceStack OrmLite Text blobbed value is retrieved as nullServiceStack OrmLite Text blobbed 值被检索为 null
【发布时间】:2019-03-25 08:34:28
【问题描述】:

我们有一个使用 ServiceStack OrmLite 进行数据库访问的小型应用程序。我目前正在调查以前工作的一个损坏的功能。

有两个相关实体:

[Alias("MyOrder")]
public class OrderEntity
{
    [AutoIncrement]
    public int Id { get; set; }
    ...

    // Saved as JSV blob in the table
    public AppEntity Processor { get; set; }
}

[Alias("MyApp")]
public class AppEntity
{
    [AutoIncrement]
    public int Id { get; set; }

    ...

    [StringLength(64)]
    public string UserName { get; set; }

    public Guid? InternalUserId { get; set; }
}

不确定这是否重要,但 AppEntity 位于另一个 DLL/程序集中。

现在有一个奇怪的行为。 Processors 已正确保存在表中。我还可以在集成测试中检索它们。但是,在生产代码中,当获取OrderEntity 对象列表时,Processor 属性在每个实例中都为空。

我在调试器中深入研究了 ServiceStack 代码,发现 JSV 字符串一开始就被正确获取,但它似乎在途中丢失了。

这是有效的单元测试:

var connectionString = @"Server=...";
var connectionFactory = new OrmLiteConnectionFactory(connectionString, new SqlServerOrmLiteDialectProvider());
var orderRepository = new OrderRepository(connectionFactory);
var orders = orderRepository.FindBySomeFilter();

// entries have not-null .Processor property

这是一个不起作用的小应用程序:

var connectionString = @"Server=...";
var connectionFactory = new OrmLiteConnectionFactory(connectionString, new SqlServerOrmLiteDialectProvider());
var orderRepository = new OrderRepository(connectionFactory);
var orders = orderRepository.FindBySomeFilter();

// .Processor is not retrieved / null for all entries

版本:

  • .NET 4.5.2
  • ServiceStack 5.4.0

【问题讨论】:

  • 两个代码示例看起来一模一样?注意:无法在本地运行以重现问题的不完整代码对其他人没有用处。我建议尝试将MCVE 放在一起,其他人可以运行以重现该问题。如果你说它曾经可以工作,我会调查它什么时候可以工作以及发生了什么改变来破坏它。此外,如果您使用最新的v5.4.1 on MyGet,它具有source link enabled,因此您可以调试到 fx 代码。
  • 谢谢,我其实是希望你能看一看,并可能想出一个看的方向,比如缺少参考资料。代码确实看起来一样 - 这就是为什么我不明白其中的区别。我现在用 5.4.1 试试,然后回来。
  • 如果相同则表明可能是由于环境差异,例如他们是否运行相同的版本,您是否添加了任何新的全局 JsConfig 更改?或者可能是一个异常被吞了,可以尝试JsConfig.ThrowOnError=true 抛出错误。
  • 版本相同,但引用的程序集不同(例如集成测试项目中的 XUnit)。项目在同一个 VS 解决方案中。失败的项目是可执行的,工作的是测试项目/库。没有自定义JsConfigJsConfig.ThrowOnError=true 不抛出,仍然Processor 为空。
  • 好的!刚刚发现OrmLite中有一个被吞下的异常。显示清单/程序集对“System.Runtime.CompilerServices.Unsafe, Version=4.0.4.0”或依赖项的引用存在问题。这是一个很好的开始。

标签: servicestack ormlite-servicestack


【解决方案1】:

您可以尝试一些方法来解决运行时依赖项加载问题,例如无法加载 System.Runtime.CompilerServices.Unsafe 依赖项:

  • 尝试手动添加对包的引用,或者如果它已经安装,请尝试卸载/重新安装它。
  • 尝试将<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> 添加到您的项目中

由于这是一个 .NET Framework 项目,您可以尝试添加绑定重定向:

<dependentAssembly>
    <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.4.1" newVersion="4.0.4.1" />
</dependentAssembly>

或者,如果您已经为此配置了绑定重定向,请尝试将其删除。

否则升级到最新的 .NET Framework v4.7+ 也可以像这样解决加载运行时系统依赖项。

【讨论】:

  • 看来损坏的应用程序中的System.Memory 的版本为4.5.1,现在可以与4.5.2 一起使用。 ServiceStack 似乎实际上只需要 4.5.1,但我假设如果在运行时仅存在 4.5.1,则使用 4.5.2 编译的库不起作用。不幸的是,我还没有使用 NuGet 来引用我们自己的库,这可能已经避免了......
  • @Tarnschaf 它与相同的运行时加载问题有关,例如您可以尝试绑定重定向。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多