ServiceStack没有为NodaTime.Instant使用自定义转换器

时间:2016-01-16 16:32:15

标签: c# sql-server servicestack ormlite-servicestack

为了提高性能,我最近在数据库中添加了一些非规范化的SQL视图,并创建了一些相关的查询模型。一切都很好,除了一件事 - ServiceStack Ormlite没有使用我的自定义类型转换器来处理某些查询模型字段,我无法弄清楚原因。真正令人困惑的是 使用转换器来处理与实际表格相关的模型。

我确认字段名称与数据库返回的列相关联。我已经确认正在构建的SQL查询Ormlite包含有问题的字段。我已经确认从该SQL返回的数据是有效的。但由于某些原因,Ormlite从未在我的转换器中点击FromDbValue方法。

这是我正在做的简化版本:

写模型

public class Session
{
    [AutoIncrement]
    public int Id { get; set; }
    public Instant SessionTime { get; set; } // <-- this is populated properly

    // -- other fields --

    [References(typeof(User))]
    public int UserId { get; set; }
    [Reference]
    public User User { get; set; }
}

查询模型

public class SessionQueryModel
{
    public int Id { get; set; }
    public Instant SessionTime { get; set; } // <-- this IS NOT populated

    // -- other fields --

    public int UserId { get; set; }
    public string UserFirstName { get; set; }
    public string UserLastName { get; set; }
}

写模型与名为Session的表相关联。查询模型与已加入SessionQueryModel表的名为User的视图相关联,并检索名称字段。

我的Instant数据存储在DATETIME2字段中,我正确注册了自定义转换器。如果出现任何问题,写入模型将无法成功补充。

我不能为我的生活找出正在发生的事情。我看不出两者之间有什么区别,字段名称匹配等等。我唯一能想到的是,Ormlite由于某种原因无法从视图中收集类型,就像它可以一样从一张桌子。可能导致这种情况的任何想法?

更新
它似乎不仅仅是我的Instant字段。还有一些其他字段也没有被填充,即使它们在名称与查询模型POCO中的属性匹配的数据中也是如此。似乎没有任何押韵或理由。其中一些是映射到字符串属性的简单VARCHAR列。

现在我真的很困惑。

1 个答案:

答案 0 :(得分:1)

我明白了。该课程有两个enum属性。一个是SessionStates类型,另一个是SessionStatuses。我想我最初没有注意到Intellisense条目,而且类似的名字使它不那么容易看到。

无论如何,enum值作为字符串存储在SQL中,而不是整数,当ServiceStack映射时,我只能假设无法将字符串解析为enum值导致所有映射到停止。

德米斯,如果你在那里,这看起来可能是一个错误。如果存在解析错误而不是简单地停止映射,我认为系统应该抛出错误。