2

因此,我正在使用 ServiceStack,并且对它有所了解。我使用过 AutoQuery 并发现它在调用直接的“GET”消息时是必不可少的。不过我遇到了一个问题,我已经看了几个小时了。我希望这只是我忽略的东西。

我为我的 AutoQuery 消息设置了一个简单的类:

public class QueryCamera : QueryDb<db_camera>
{
}

我有一个 OrmLite 连接,用于从数据库中检索 db_camera 整体。这一切都很好。我不想从数据库中返回模型,但我想返回一个 DTO,我已将其定义为另一个类。因此,使用 QueryDb 的版本,我的请求消息现在是这样的:

public class QueryCamera : QueryDb<db_camera, Camera>
{
}

Camera 类是我的 DTO。调用仍然执行,但我没有得到任何结果。我在 db_camera 类上设置了一个映射器扩展方法 ToDto() 以返回一个 Camera 实例。

也许我只是习惯了 ServiceStack 让事情变得如此简单......但是我如何获得上面的 AutoQuery 请求来执行我的请求的映射?由于我指定了我想要的转换,数据检索现在对我来说是手动操作吗?那么这种类型的价值在哪里呢?现在我有责任查询数据库,然后在我的数据模型记录上调用 .ToDto() 以返回 DTO 对象吗?

编辑:我刚刚观察到的其他事情......我仍然从 AutoQueryViewer 中返回的数据集中获取行数,但字段名称是数据模型类 db_camera 而不是 Camera。

在此处输入图像描述

4

1 回答 1

4

QueryDb<From, Into>无法使用您的自定义 DTO 扩展方法,它用于从已执行的 AutoQuery 中选择一组精选的列,这些列也可用于引用连接表上的列

如果您希望 DTO 上的名称与数据模型上的名称不同,您可以使用[Alias]属性映射回您的 DB 列名称,这样您就可以为您的 DTO 属性命名任何您喜欢的名称。另一方面,您可以更改 DTO 属性被序列化为的属性,例如:

[DataContract]
public class Camera
{
    [DataMember(Name = "Id")]        // serialized as `Id`
    public camera_id { get; set; }   // populated with db_camera.camera_id

    [DataMember]
    [Alias("model")]                 // populated with db_camera.model
    public CameraModel { get; set; } // serialized as `CameraModel`
}
于 2017-06-27T17:55:04.973 回答