开始把头发拉过来,所以我想在这里问一下。
我有这个简单的服务:
public class EventService : Service
{
public object Get(GetEvents request)
{
return Db.LoadSelect<Event>();
}
}
LoadSelect()抛出NullReferenceException。
我实际上已经让它更早地完成了工作,但不知道现在是什么导致它抛出异常。
已将其追踪到实际在ServiceStack中抛出异常的这一行(ServiceStack.OrmLite.Support.LoadList):
LoadList-NullReferenceException
但是看看当地人,一切似乎都很好。我的意思是,它显然可以从数据库中获取数据,因此该部分很好,数据是正确的,甚至似乎解决了ForeignKeys以及所有内容。
那么它无法获得或未设置的价值,我不知道:/
有关如何进一步排除故障的任何提示都会很棒! =)
[EDIT1 - 以下是POCO]
public class Event
{
[PrimaryKey]
public int Id { get; set; }
public int Timestamp { get; set; }
public int MessageId { get; set; }
[Reference]
public Message Message { get; }
}
public class Message
{
[PrimaryKey]
public int Id { get; set; }
public string Text { get; set; }
}
[EDIT2 - 阅读完答案后的结果]
正如在最初的问题中所提到的,已经执行了基本的NullReferenceException故障排除,并且我尽可能深入地挖掘到ServiceStack框架中以尝试识别罪魁祸首。
据我所知,抛出异常的调用消耗的所有变量都是okey(见下面的截图)。
唯一的一个(在下图中突出显示)应该由ServiceStack OrmLite References API处理,但也许更熟悉框架的人可以发表评论,但这对我来说至少看起来都很好......
LoadList-NullReferenceException-002
也许我正在使用References API错误?
数据库结构非常简单:
活动表
| Event | CREATE TABLE `Event` (
`Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Timestamp` int(11) NOT NULL,
`MessageId` int(4) unsigned NOT NULL,
PRIMARY KEY (`Id`),
KEY `MessageId_FK` (`MessageId`),
CONSTRAINT `MessageId_FK` FOREIGN KEY (`MessageId`) REFERENCES `Message` (`Id`) ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 |
mysql> SELECT * FROM Event;
+----+------------+-----------+
| Id | Timestamp | MessageId |
+----+------------+-----------+
| 1 | 1501026747 | 1 |
| 2 | 1501027047 | 1 |
+----+------------+-----------+
消息表
| Message | CREATE TABLE `Message` (
`Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Text` varchar(255) NOT NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `Id_UNIQUE` (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 |
mysql> SELECT * FROM Message;
+----+---------------------------------------------+
| Id | Text |
+----+---------------------------------------------+
| 1 | Someone is at the door! |
| 2 | 1 has acknowledged the notification. |
| 3 | 2 has acknowledged the notification. |
| 4 | 3 has acknowledged the notification. |
+----+---------------------------------------------+
例外详情
System.NullReferenceException occurred
HResult=0x80004003
Message=Object reference not set to an instance of an object.
Source=ServiceStack.OrmLite
StackTrace:
at ServiceStack.OrmLite.Support.LoadList`2.SetRefSelfChildResults(FieldDefinition fieldDef, ModelDefinition refModelDef, FieldDefinition refSelf, IList childResults) in C:\TeamCity\buildAgent\work\12884bd5feef0ce7\src\ServiceStack.OrmLite\Support\LoadList.cs:line 154
答案 0 :(得分:2)
为了回答我自己的问题,出于某种原因,我决定删除其中一个POCO(Event.Message)的引用属性上的setter。
[Reference]
public Message Message { get; }
当然应该(并且在某个时候,这就是为什么它能在短时间内起作用):
[Reference]
public Message Message { get; set; }
难怪ServiceStack无法设置属性,然后将其用于References API。