【发布时间】: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 解决方案中。失败的项目是可执行的,工作的是测试项目/库。没有自定义
JsConfig,JsConfig.ThrowOnError=true不抛出,仍然Processor为空。 -
好的!刚刚发现OrmLite中有一个被吞下的异常。显示清单/程序集对“System.Runtime.CompilerServices.Unsafe, Version=4.0.4.0”或依赖项的引用存在问题。这是一个很好的开始。
标签: servicestack ormlite-servicestack