【问题标题】:Db.LoadSelect throws NullReferenceExceptionDb.LoadSelect 抛出 NullReferenceException
【发布时间】:2017-07-26 20:38:46
【问题描述】:

开始为此烦恼,所以我想我可以试试在这里问。

我有这个简单的服务:

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 - 阅读 dup 答案后的发现]

正如最初的问题所述,基本的 NullReferenceException 故障排除已经完成,我已尽可能深入地研究 ServiceStack 框架以尝试找出罪魁祸首。

据我所见,引发异常的调用所消耗的所有变量都正常(见下面的屏幕截图)。

唯一的一个(在下图中突出显示)应该由 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

【问题讨论】:

  • 我知道仅仅发布异常消息的图像是没有帮助的,但正如您可能注意到的,我的图像还包括局部变量列表,它显示了应该进入的所有变量抛出异常的函数。这就是我来到这里的全部原因,因为在那方面一切看起来都很好。无论如何,已按要求复制了异常详细信息,而不是提供任何新信息。 @威尔

标签: servicestack ormlite-servicestack


【解决方案1】:

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

[Reference]
public Message Message { get; }

当然应该是(并且在某个时候曾经是,这就是它在短时间内起作用的原因):

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

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

【讨论】:

  • 听了 resharper 的建议后,我遇到了同样的错误。
猜你喜欢
  • 2013-05-30
  • 2020-11-17
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多