मैं एक ऐसे प्रोजेक्ट पर काम कर रहा हूं जिसके लिए एकाधिक-सरणी जेसन के लिए POST विधि की आवश्यकता है जहां डेटा एफके के साथ 5 अलग-अलग संबंधित तालिकाओं पर स्थित है।

जीईटी का उपयोग कर जेसन आउटपुट यहां दिया गया है:

{
  "UserId": 1,
  "Id": 1,
  "ValueStoryName": "Value Story 101",
  "Organization": "Charity Foundation",
  "Industry": "Education",
  "Location": "Singapore",
  "AnnualRevenue": 1000,
  "CreatedDate": "2017-07-27T00:00:00",
  "ModifiedDate": "2017-01-01T00:00:00",
  "BusinessValueToYou": [
    {
      "Id": 1,
      "BVUSId": 1,
      "BalanceSheet": 348,
      "IncomeStatement": 546,
      "ValueDriver": [
        {
          "BVUSId": 1,
          "BVUId": 1,
          "ValueDriver": "Give kind to others",
          "Selected": true,
          "TotalSavings": 0,
          "SubLever": [
            {
              "BVUId": 1,
              "BVUSVDId": 1,
              "Item": "Help when needed",
              "Selected": true,
              "EstAnnualValue": 1,
              "UserInput": [
                {
                  "BVUSVDId": 1,
                  "BVUUIId": 1,
                  "Item": "Total Benefit",
                  "UserInput": 10
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

और मेरे पास वर्तमान में नियंत्रक के तहत मेरी POST विधि के लिए क्या है:

// POST: api/ValueStories
[ResponseType(typeof(ValueStory))]
public async Task<IHttpActionResult> PostValueStory(ValueStory valueStory)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    db.ValueStories.Add(valueStory);
    db.BusinessValueToYou.AddRange(valueStory.BusinessValueToYou);

    await db.SaveChangesAsync();

    return CreatedAtRoute("DefaultApi", new { id = valueStory.Id }, valueStory);
}

ऊपर दिया गया कोड केवल आपके लिए वैल्यूस्टोरी और बिजनेस वैल्यू के लिए डेटा जोड़ता है, लेकिन वैल्यूड्राइवर, सबवैल्यूड्राइवर और यूजर इनपुट के लिए वैल्यू जोड़ने में असमर्थ है। मैं इस काम को करने के लिए दिमाग से क्रैक कर रहा हूं लेकिन कोई किस्मत नहीं। किसी भी मदद और संदर्भ की बहुत सराहना की जाएगी।

यह मेरा BusinessValueToYou मॉडल है:

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace AribaWebService.Models
{
    public class BusinessValueToYou
    {
        // Foreign Key
        public int Id { get; set; }
        [Key]
        public int BVUSId { get; set; }
        public decimal BalanceSheet { get; set; }
        public decimal IncomeStatement { get; set; }

        // Navigation property
        public virtual ValueStory ValueStory { get; set; }

        public List<BVUValueDriver> ValueDriver { get; set; }

    }
    public class BVUValueDriver
    {
        // Foreign Key
        public int BVUSId { get; set; }
        [Key]
        public int BVUId { get; set; }
        [Required]
        public string ValueDriver { get; set; }
        public bool Selected { get; set; }
        public decimal TotalSavings { get;  set;}

        // Navigation property
        public virtual BusinessValueToYou BusinessValueToYou { get; set; } 

        public List<BVUSubValueDriver> SubLever { get; set; }
        }

    public class BVUSubValueDriver
    {
        // Foreign Key
        public int BVUId { get; set; }
        [Key]
        public int BVUSVDId { get; set; }
        [Required]
        public string Item { get; set; }
        public bool Selected { get; set; }
        public decimal EstAnnualValue { get; set; }


        // Navigation property
        public virtual BVUValueDriver BVUValueDriver { get; set; }

        public List<BVUUserInput> UserInput { get; set; }

    }

    public class BVUUserInput
    {
        // Foreign Key
        public int BVUSVDId { get; set; }
        [Key]
        public int BVUUIId { get; set; }
        [Required]
        public string Item { get; set; }
        public double UserInput { get; set; }

        // Navigation property
        public virtual BVUSubValueDriver BVUSubValueDriver { get; set; }

    }
}

यहाँ मेरा वैल्यूस्टोरी मॉडल है:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace AribaWebService.Models
{
    public class ValueStoryDetailDTO
    {
        // Foreign Key
        public int UserId { get; set; } 
        [Key]
        public int Id { get; set; }
        public string ValueStoryName { get; set; }
        public string Organization { get; set; }
        public string Industry { get; set; }
        public string Location { get; set; }
        public string Currency { get; set; }

        public double AnnualRevenue { get; set; }
        public DateTime CreatedDate { get; set; }
        public DateTime ModifiedDate { get; set; }

        // Navigation property
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public virtual User User { get; set; }

        public List<AreaOfInterest> AreaOfInterest { get; set; }
        public List<BusinessValueToYou> BusinessValueToYou { get; set; }
        public List<BusinessValueFromSap> BusinessValueFromSap { get; set; }


    }
}
4
Raymund Evangelista 10 अगस्त 2017, 06:23

2 जवाब

सबसे बढ़िया उत्तर

मैं इसे AddRange का उपयोग करके काम करने में कामयाब रहा। सहायता के लिए धन्यवाद।

0
Raymund Evangelista 14 अगस्त 2017, 10:58

आम तौर पर हम वास्तविक डीबी इकाइयों को सीधे वेब एपीआई में उजागर नहीं करते हैं, केवल ओवरएक्सपोज को रोकने के लिए हमें व्यू मॉडल या डीटीओ का उपयोग करके जो चाहिए उसे वापस कर दें।

एक मॉडल में आपको जो चाहिए उसे वापस करने के लिए आप अपनी प्राप्त विधि बदल सकते हैं।

ऑटो मैपर के बारे में अधिक जानें http://automapper.org/

बेहतर रीस्टफुल एपीआई बनाएं: https://www.codeproject .com/Articles/990492/RESTful-Day-sharp-Enterprise-Level-Application

आपके प्रश्न के लिए यह एक उदाहरण है कि एकाधिक सरणी कैसे पढ़ें:

// POST: api/ValueStories
public async Task<IHttpActionResult> PostValueStory(AbcViewModel viewModel)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    //Manual map or use Automapper here
    var entity = Mapper.Map<ValueStory>(viewModel);
    db.ValueStories.Add(entity);
    //db.BusinessValueToYou.AddRange(entity.BusinessValueToYou); // can map with automapper

    await db.SaveChangesAsync();

    return CreatedAtRoute("DefaultApi", new { id = entity .Id }, entity );
}

public class AbcViewModel
{
    public int UserId { get; set; }
    public int Id { get; set; }
    public string ValueStoryName { get; set; }
    public string Organization { get; set; }
    public string Industry { get; set; }
    public string Location { get; set; }
    public string AnnualRevenue { get; set; }
    public DateTime CreatedDate { get; set; }
    public DateTime ModifiedDate { get; set; }
    public IEnumerable<BusinessValueToYouViewModel> BusinessValueToYou { get; set; }

}

public class BusinessValueToYouViewModel
{
    public int Id { get; set; }
    public int BVUSId { get; set; }
    public int BalanceSheet { get; set; }
    public int IncomeStatement { get; set; }
    public IEnumerable<ValueDriverViewModel> ValueDriver { get; set; }
}

public class ValueDriverViewModel
{
    public int Id { get; set; }
    public int BVUSId { get; set; }
    public int BVUId { get; set; }
    public string ValueDriver { get; set; }
    public bool Selected { get; set; }
    public int TotalSavings { get; set; }
}
2
Hung Quach 11 अगस्त 2017, 06:29