ID вставленной записи - PullRequest
0 голосов
/ 09 мая 2018

Мне интересно, как получить идентификатор вставленной записи, возвращенной в ответе HTTP на метод POST

Метод контроллера:

public HttpResponseMessage POST([FromBody]Map newmap)
{
try
  {
   using (SHATDbEntities entities = new SHATDbEntities())
    {
     entities.Maps.Add(newmap);
     entities.SaveChanges();
     var message = Request.CreateResponse(HttpStatusCode.Created, newmap);
     message.Headers.Location = new Uri(Request.RequestUri + newmap.Id.ToString());
     return message;
     }
   }
    catch (Exception ex)
   {
     return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
   }
   }

Ответ обработан:

HttpClient client = new HttpClient();
            client.BaseAddress = new Uri("http://localhost:2351/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/json"));
            HttpResponseMessage response = client.PostAsJsonAsync(RequestURI, newmap).Result;
int mapid = int.Parse(responsestatusCode.Content.ReadAsStringAsync().Result)

Объяснение :

Я попробовал другое решение, которое доступно при переполнении стека, но не получило решение и приведенный выше код, но через исключение, т. Е. здесь

1 Ответ

0 голосов
/ 10 мая 2018

Если используется Entity Framework и столбец Identity установлен в качестве первичного ключа для таблицы:

Взят из этого SO: Как я могу получить Id вставленного объекта в Entity Framework?

Структура сущностей по умолчанию следует за каждой вставкой с помощью SELECT SCOPE_IDENTITY () при использовании автоматически сгенерированных идентификаторов.

Поэтому после вызова .SaveChanges () убедитесь, что ваш объект newMapимеет значение Id.

Если вы не используете Entity Framework, здесь есть два решения: Как получить последний вставленный идентификатор?

Одним из них является использование OUTпараметр, другой является SCOPE_IDENTITY.И то, и другое потребует внесения изменений в базовый sql, созданный для вашего метода SaveChanges ().

Ваш response.Content должен быть просто представлением JSON вашего объекта newMap.Десериализовать его обратно на карту, и вы можете получить к нему доступ таким образом.

Десериализация JSON должна быть такой простой, как:

var deserializedMap = 
    JsonConvert.DeserializeObject<Map>(response.Content);

Вы также можете попробовать:

var deserializedMap = JsonConvert.DeserializeObject<Map>(await response.Content.ReadAsJSonAsync());

Поскольку вы выполняете асинхронный http-запрос.

...