Почему сервисный стек возвращает Int64 вместо Int32? - PullRequest
0 голосов
/ 12 января 2019

Моя модель SecPermission имеет столбец Id = int, который является Int32. Когда я добавляю новую запись, почему она возвращает новый добавленный идентификатор как 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 голосов
/ 12 января 2019

Вы никогда не должны возвращать тип значения в ServiceStack Service, он должен быть ссылочным типом, обычно DTO с типизированным ответом, но также может быть необработанным типом данных, таким как string или byte[], но он никогда не должен быть Значение Тип, например целое число, которое не будет работать в некоторых функциях ServiceStack.

Для этой службы я бы либо возвратил объект SecPermission, либо объект AddPermissionResponse с целым числом в результирующем значении.

Обратите внимание, что OrmLite Insert() API возвращает long, поэтому вы видите длинную, однако вам нужно либо вызвать Save (), либо указать selectIdentity: true , чтобы получить недавно вставленный идентификатор первичного ключа [AutoIncrement], например:

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

или

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

Кроме того, вам не нужны ни [PrimaryKey], ни [AutoIncrement] в OrmLite, поскольку [AutoIncrement] определяет первичный ключ самостоятельно, как и при использовании соглашения о свойстве Id .

.

Также, если вы собираетесь позвонить в Службу напрямую, вы также можете ввести ответ, чтобы избежать разыгрывания, например:

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

Тогда вам не нужно разыгрывать заклинание при непосредственном вызове, например:

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

В ServiceStack нет различий в поведении при использовании object или в типизированном ответе, например SecPermission, хотя лучше указывать его в запросе DTO с помощью маркера интерфейса IReturn<T>, например:

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

Поскольку он включает сквозные типизированные API при вызове из сервисных клиентов, например:

SecPermission response = client.Post(new AddPermission { ... });
...