Search code examples
c#asp.net-web-apiasp.net-mvc-5asp.net-web-api2asp.net-web-api-routing

How to get Web API with one to many relationship


I have 3 entities. entity sensor, entity tanaman, and entity tanamanhassensor. i want make graph from api tanamanhassensor use json jquery. How to display the graph? if i use my json, the api http://xxxxx/api/tanaman_has_sensor is not found

My entities like this :

public partial class Tanaman_has_Sensor
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Tanaman_has_Sensor()
    {
        this.Tanaman_has_Sensor_has_Jadwal = new HashSet<Tanaman_has_Sensor_has_Jadwal>();
    }

    public int Tanaman_IdTanaman { get; set; }
    public int Sensor_IdSensor { get; set; }
    public double NilaiSensor { get; set; }
    public System.DateTime WaktuSensor { get; set; }
    public string Lokasi { get; set; }

    public virtual Sensor Sensor { get; set; }
    public virtual Tanaman Tanaman { get; set; }
    public virtual ICollection<Tanaman_has_Sensor_has_Jadwal> Tanaman_has_Sensor_has_Jadwal { get; set; }
}

This is my controller

 public class TanamanhasSensorController : ApiController
{
    private SmartGreenHouseEntities db = new SmartGreenHouseEntities();

    // GET: api/TanamanhasSensor
    public IQueryable<Tanaman_has_Sensor> GetTanaman_has_Sensor()
    {
        return db.Tanaman_has_Sensor;
    }

    // GET: api/TanamanhasSensor/5
    [ResponseType(typeof(Tanaman_has_Sensor))]
    public async Task<IHttpActionResult> GetTanaman_has_Sensor(int id)
    {
        Tanaman_has_Sensor tanaman_has_Sensor = await db.Tanaman_has_Sensor.FindAsync(id);
        if (tanaman_has_Sensor == null)
        {
            return NotFound();
        }

        return Ok(tanaman_has_Sensor);
    }
}

Application json

[{
"Tanaman_IdTanaman": 1,
"Sensor_IdSensor": 2,
"NilaiSensor": 3.1,
"WaktuSensor": "2016-11-19T07:38:42.519263+07:00",
"Lokasi": "sample string 5",
"Sensor": {
  "$id": "1",
  "IDSensor": 1,
  "NamaSensor": "sample string 2",
  "Tanaman_has_Sensor": [
    {
      "Tanaman_IdTanaman": 1,
      "Sensor_IdSensor": 2,
      "NilaiSensor": 3.1,
      "WaktuSensor": "2016-11-19T07:38:42.519263+07:00",
      "Lokasi": "sample string 5",
      "Sensor": {
        "$ref": "1"
      }]

My json

 $.ajax({
            type: 'GET',
            url: "http://xxxxx/api/tanaman_has_sensor",
            dataType: 'json',
            async: false,
            contentType: "application/json; charset=utf-8",
            data: dd,

Solution

  • Assuming default convention-based routing for Web API 2

    // Convention-based routing.
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
    

    you should be calling

    url: "http://xxxxx/api/TanamanhasSensor
    

    by convention the route table matches controller name minus Convention

    thus TanamanhasSensorController will map to TanamanhasSensor

    Even your controller demonstrates this in the comments

    public class TanamanhasSensorController : ApiController {
        private SmartGreenHouseEntities db = new SmartGreenHouseEntities();
    
        // GET: api/TanamanhasSensor
        [HttpGet]
        public IQueryable<Tanaman_has_Sensor> GetTanaman_has_Sensor() {
            return db.Tanaman_has_Sensor;
        }
    
        // GET: api/TanamanhasSensor/5
        [HttpGet]
        [ResponseType(typeof(Tanaman_has_Sensor))]
        public async Task<IHttpActionResult> GetTanaman_has_Sensor(int id) {
            Tanaman_has_Sensor tanaman_has_Sensor = await db.Tanaman_has_Sensor.FindAsync(id);
            if (tanaman_has_Sensor == null) {
                return NotFound();
            }
    
            return Ok(tanaman_has_Sensor);
        }
    }