为什么服务堆栈返回Int64而不是Int32?

时间:2019-01-11 22:28:49

标签: servicestack

我的模型SecPermission具有Id = int列,即Int32。添加新记录时,为什么返回新添加的ID作为Int64?

服务方法

public object Post(AddPermission request)
        {
            var perm = request.ConvertTo<SecPermission>();
            perm.AuditUserId = UserAuth.Id;
            LogInfo(typeof(SecPermission), request, LogAction.Insert);
            return Db.Insert(perm);
        }

单元测试代码

     using (var service = HostContext.ResolveService<SecurityService>(authenticatedRequest))
                    {
///**this line is returning an object with Int64 in it.
                        int id = (int) service.Post(new AddPermission { Name = name, Description = "TestDesc" });
                        service.Put(new UpdatePermission { Id = permission, Name = name,Description = "TestDesc" });
                        service.Delete(new DeletePermission { Id = Convert.ToInt32(id)});
                    }

     public class SecPermission : IAudit
            {
                [AutoIncrement]
                [PrimaryKey]
                public int Id { get; set; }

            [Required]
            [StringLength(50)]
            public string Name { get; set; }

            [Required]
            [StringLength(75)]
            public string Description { get; set; }

            [Required]
            public PermissionType PermissionType { get; set; }

            public int AuditUserId { get; set; }
            public DateTime AuditDate { get; set; } = DateTime.Now;
        }

1 个答案:

答案 0 :(得分:1)

永远不要在ServiceStack服务中返回值类型,它必须是引用类型,通常是类型化响应DTO,但也可以是原始数据类型,例如stringbyte[],但是它永远不能是像整数这样的值类型,否则将无法在某些ServiceStack功能中使用。

对于该服务,我要么返回SecPermission对象,要么返回结果值中带有整数的AddPermissionResponse对象。

请注意,OrmLite Insert() API返回一个long,这就是为什么看到很长的原因,但是您需要call Save() or specify selectIdentity:true才能获取新插入的ID。 [AutoIncrement]主键,例如:

var newId = db.Insert(perm, selectIdentity:true);

Db.Save(perm);
var newId = perm.Id; //auto populated with auto incremented primary key

在OrmLite中,您也不需要[PrimaryKey][AutoIncrement],因为[AutoIncrement]自己指定了主键,就像使用Id property convention一样。

如果您要直接致电服务,也可以输入“ Response”以避免强制转换,例如:

public SecPermission Post(AddPermission request)
{
    //...
    Db.Save(perm);
    return perm;
}

然后,您无需在直接调用它时进行投射,例如:

var id = service.Post(new AddPermission { ... }).Id;

使用object或类似SecPermission的类型化响应在ServiceStack中没有行为差异,尽管最好使用IReturn<T>接口标记在请求DTO上指定它,例如:

public AddPermission : IReturn<SecPermission> { ... }

当从服务客户端调用时启用端到端类型化API,例如:

SecPermission response = client.Post(new AddPermission { ... });
相关问题