Db.LoadSelect抛出NullReferenceException

时间:2017-07-26 20:38:46

标签: servicestack ormlite-servicestack

开始把头发拉过来,所以我想在这里问一下。

我有这个简单的服务:

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

1 个答案:

答案 0 :(得分:2)

为了回答我自己的问题,出于某种原因,我决定删除其中一个POCO(Event.Message)的引用属性上的setter。

[Reference]
public Message Message { get; }

当然应该(并且在某个时候,这就是为什么它能在短时间内起作用):

[Reference]
public Message Message { get; set; }

难怪ServiceStack无法设置属性,然后将其用于References API。