为了提高性能,我最近在数据库中添加了一些非规范化的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
列。
现在我真的很困惑。
答案 0 :(得分:1)
我明白了。该课程有两个enum
属性。一个是SessionStates
类型,另一个是SessionStatuses
。我想我最初没有注意到Intellisense条目,而且类似的名字使它不那么容易看到。
无论如何,enum
值作为字符串存储在SQL中,而不是整数,当ServiceStack映射时,我只能假设无法将字符串解析为enum
值导致所有映射到停止。