Можете ли да прочетете допълнителни низове от данни от Web API POST, които не са в модела на данни?

В Entity Framework имам обект DBGeography:

using System.Data.Entity.Spatial;
...
public DbGeography Location { get; set; }

Тъй като не съм открил по-добър начин за изпращане на POINT обект през JSON, възнамерявам да изпратя стойности на низове „lat“ и „lng“ от моя Javascript код и да ги използвам на сървъра по време на метода POST:

Екранна снимка от POSTMan REST клиент

public async Task<IHttpActionResult> PostI4Item(myEntity item)
        {
          var lat = (VALUE TO BE SOURCED);
          var lng = (VALUE TO BE SOURCED);
          string Point = String.Format("POINT({0} {1})", lat, lng);
          item.Location = DbGeography.PointFromText(Point, 4326);
          myEntity current = await InsertAsync(item);
          return CreatedAtRoute("Tables", new { id = current.Id }, current);
        }

Проблемът е, че не знам как да извлека стойности, изпратени до POST, които не се очакват в рамките на модела на данни. item.Location е достъпен, защото е деклариран. Но дори и да изпращам допълнителни двойки ключ/стойност в тялото на „lat“ и „lng“, как мога да открия тези стойности в кода? Не мога да използвам item.lat и item.lng, тъй като те не са декларирани и не искам допълнителни DB колони за тези стойности... Искам само да бъдат приети като вход, но не и запазени.

Има ли метод в модела на данни, където мога да декларирам стойност (може би нещо само за четене или вътрешно), която се очаква при заявката и е достъпна за използване в POST метода, но всъщност не се записва в моята база данни?


person kdpnz    schedule 29.01.2021    source източник
comment
Бях намерил този отговор и вярвах, че може първоначално да е решил проблема stackoverflow.com/questions/33792793/, но скоро разбрах, след като опресних базата данни, че това просто създава допълнителни колони за географска ширина и дължина... нещо, което съм надявайки се да избегнете, като само съхранявате стойността на DBGeography след изчисляване на обекта Point().   -  person kdpnz    schedule 31.01.2021


Отговори (1)


Тази публикация https://stackoverflow.com/a/35982194/3026149 от Mohamed Badr & Niels R и тази публикация https://stackoverflow.com/a/18215561/3026149 от haim770 е това, което реши проблема ми.

Не знаех, че има наличен атрибут [NotMapped] за моя модел на данни, което означава, че мога да очаквам стойности на lat & lng, без да ги налага да създават колони на база данни в Entity Framework.

Така моят клас става:

using System.Data.Entity.Spatial;
using System.ComponentModel.DataAnnotations.Schema;
...
public DbGeography Location { get; set; }
[NotMapped]
public double lng { get; set; }
[NotMapped]
public double lat { get; set; }

И кодът ми става:

public async Task<IHttpActionResult> PostI4Item(myEntity item)
        {
          var Point = DbGeography.FromText($"POINT({item.lng} {item.lat})");
          item.Location = Point;
          myEntity current = await InsertAsync(item);
          return CreatedAtRoute("Tables", new { id = current.Id }, current);
        }
person kdpnz    schedule 01.02.2021