खोज…


OData पैकेज स्थापित करें

उपकरण मेनू से, NuGet पैकेज प्रबंधक> पैकेज प्रबंधक कंसोल चुनें। पैकेज प्रबंधक कंसोल विंडो में, टाइप करें:

Install-Package Microsoft.AspNet.Odata

यह आदेश नवीनतम OData NuGet संकुल स्थापित करता है।

एंटिटी फ्रेमवर्क को सक्षम करें

इस ट्यूटोरियल के लिए, हम बैक-एंड डेटाबेस बनाने के लिए Entity Framework (EF) कोड फर्स्ट का उपयोग करेंगे।

वेब API OData को EF की आवश्यकता नहीं है। किसी भी डेटा-एक्सेस परत का उपयोग करें जो डेटाबेस संस्थाओं को मॉडल में अनुवाद कर सकता है।

सबसे पहले, EF के लिए NuGet पैकेज स्थापित करें। उपकरण मेनू से, NuGet पैकेज प्रबंधक > पैकेज प्रबंधक कंसोल चुनें । पैकेज प्रबंधक कंसोल विंडो में, टाइप करें:

Install-Package EntityFramework

Web.config फ़ाइल को खोलें, और विन्यास तत्व के अंदर निम्नलिखित खंड जोड़ने के लिए, configSections तत्व के बाद।

<configuration>
  <configSections>
    <!-- ... -->
  </configSections>

  <!-- Add this: -->
  <connectionStrings>
    <add name="ProductsContext" connectionString="Data Source=(localdb)\v11.0; 
        Initial Catalog=ProductsContext; Integrated Security=True; MultipleActiveResultSets=True; 
        AttachDbFilename=|DataDirectory|ProductsContext.mdf"
      providerName="System.Data.SqlClient" />
  </connectionStrings>

यह सेटिंग किसी LocalDB डेटाबेस के लिए कनेक्शन स्ट्रिंग जोड़ता है। जब आप स्थानीय रूप से ऐप चलाते हैं तो इस डेटाबेस का उपयोग किया जाएगा।

इसके बाद, एक वर्ग मॉडल फ़ोल्डर में ProductsContext नामित जोड़ें:

using System.Data.Entity;
namespace ProductService.Models
{
    public class ProductsContext : DbContext
    {
        public ProductsContext() 
                : base("name=ProductsContext")
        {
        }
        public DbSet<Product> Products { get; set; }
    }
}

कंस्ट्रक्टर में, "name = ProductContext" कनेक्शन स्ट्रिंग का नाम देता है।

OData समापन बिंदु कॉन्फ़िगर करें

फ़ाइल खोलें App_Start / WebApiConfig.cs। बयानों का उपयोग करके निम्नलिखित जोड़ें:

using ProductService.Models;
using System.Web.OData.Builder;
using System.Web.OData.Extensions;

फिर रजिस्टर विधि में निम्नलिखित कोड जोड़ें:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // New code:
        ODataModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntitySet<Product>("Products");
        config.MapODataServiceRoute(
            routeName: "ODataRoute",
            routePrefix: null,
            model: builder.GetEdmModel());
    }
}

यह कोड दो काम करता है:

  • एक इकाई डेटा मॉडल (EDM) बनाता है।
  • एक मार्ग जोड़ता है।

एक ईडीएम डेटा का एक सार मॉडल है। EDM का उपयोग सेवा मेटाडेटा दस्तावेज़ बनाने के लिए किया जाता है। ODataConventionModelBuilder वर्ग डिफ़ॉल्ट नामकरण सम्मेलनों का उपयोग करके EDM बनाता है। इस दृष्टिकोण को कम से कम कोड की आवश्यकता होती है। यदि आप EDM पर अधिक नियंत्रण चाहते हैं, तो आप स्पष्ट रूप से गुण, कुंजियाँ और नेविगेशन गुण जोड़कर EDM बनाने के लिए ODataModelBuilder वर्ग का उपयोग कर सकते हैं।

एक मार्ग वेब एपीआई को बताता है कि एचटीटीपी अनुरोधों को समापन बिंदु पर कैसे रूट किया जाए। OData v4 रूट बनाने के लिए, MapODataServiceRoute एक्सटेंशन विधि पर कॉल करें।

यदि आपके आवेदन में कई ओडिटा समापन बिंदु हैं, तो प्रत्येक के लिए एक अलग मार्ग बनाएं। प्रत्येक मार्ग को एक अद्वितीय मार्ग नाम और उपसर्ग दें।

OData नियंत्रक जोड़ें

एक नियंत्रक एक वर्ग है जो HTTP अनुरोधों को संभालता है। आप अपनी OData सेवा में सेट की गई प्रत्येक इकाई के लिए एक अलग नियंत्रक बनाते हैं। इस ट्यूटोरियल में, आप उत्पाद इकाई के लिए एक कंट्रोलर बनाएंगे।

समाधान एक्सप्लोरर में, कंट्रोलर फ़ोल्डर पर राइट-क्लिक करें और Add > Class चुनें । वर्ग ProductController का नाम।

OData v3 के लिए इस ट्यूटोरियल का संस्करण एड कंट्रोलर मचान का उपयोग करता है। वर्तमान में, OData v4 के लिए कोई मचान नहीं है।

निम्न के साथ ProductsController.cs में बॉयलरप्लेट कोड बदलें।

using ProductService.Models;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.OData;
namespace ProductService.Controllers
{
    public class ProductsController : ODataController
    {
        ProductsContext db = new ProductsContext();
        private bool ProductExists(int key)
        {
            return db.Products.Any(p => p.Id == key);
        } 
        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}

नियंत्रक डेटाबेस एफई का उपयोग कर का उपयोग करने के लिए ProductsContext वर्ग का उपयोग करता है। सूचना नियंत्रक ProductsContext के निपटान के लिए निपटान विधि ओवरराइड करता है कि।

यह नियंत्रक के लिए प्रारंभिक बिंदु है। अगला, हम CRUD संचालन के सभी तरीकों को जोड़ेंगे।

इकाई सेट पर प्रदर्शन CRUD

इकाई सेट को छोड़कर

ProductsController के लिए निम्न विधियों जोड़ें।

[EnableQuery]
public IQueryable<Product> Get()
{
    return db.Products;
}

[EnableQuery]
public SingleResult<Product> Get([FromODataUri] int key)
{
    IQueryable<Product> result = db.Products.Where(p => p.Id == key);
    return SingleResult.Create(result);
}

गेट विधि का पैरामीटर रहित संस्करण संपूर्ण उत्पाद संग्रह लौटाता है। मुख्य पैरामीटर के साथ विधि प्राप्त करें इसकी कुंजी (इस मामले में, आईडी संपत्ति) द्वारा एक उत्पाद दिखता है।

[ सक्षम करें ] विशेषता ग्राहकों को क्वेरी को संशोधित करने के लिए सक्षम करती है, जिसमें $ फिल्टर, $ सॉर्ट और $ पेज जैसे क्वेरी विकल्पों का उपयोग किया जाता है। अधिक जानकारी के लिए, सहायक क्वेरी विकल्प का समर्थन करना देखें।

इकाई सेट में एक इकाई जोड़ना

डेटाबेस में एक नया उत्पाद जोड़ने के लिए क्लाइंट को सक्षम करने के लिए, निम्न विधि जोड़ें ProductController

public async Task<IHttpActionResult> Post(Product product)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    db.Products.Add(product);
    await db.SaveChangesAsync();
    return Created(product);
}

एक इकाई अद्यतन करना

OData एक इकाई, PATCH और PUT को अपडेट करने के लिए दो अलग-अलग शब्दार्थों का समर्थन करता है।

  • PATCH आंशिक अद्यतन करता है। क्लाइंट केवल अद्यतन करने के लिए गुणों को निर्दिष्ट करता है।
  • PUT पूरी इकाई को प्रतिस्थापित करता है।

PUT का नुकसान यह है कि क्लाइंट को इकाई में सभी गुणों के लिए मान भेजना चाहिए, जिसमें मूल्य भी नहीं बदल रहे हैं। OData युक्ति कहती है कि PATCH को प्राथमिकता दी जाती है।

किसी भी स्थिति में, यहाँ PATCH और PUT दोनों तरीकों के लिए कोड है:

public async Task<IHttpActionResult> Patch([FromODataUri] int key, Delta<Product> product)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    var entity = await db.Products.FindAsync(key);
    if (entity == null)
    {
        return NotFound();
    }
    product.Patch(entity);
    try
    {
        await db.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!ProductExists(key))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }
    return Updated(entity);
}

public async Task<IHttpActionResult> Put([FromODataUri] int key, Product update)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    if (key != update.Id)
    {
        return BadRequest();
    }
    db.Entry(update).State = EntityState.Modified;
    try
    {
        await db.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!ProductExists(key))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }
    return Updated(update);
}

PATCH के मामले में, नियंत्रक परिवर्तनों को ट्रैक करने के लिए डेल्टा <T> प्रकार का उपयोग करता है।

एक इकाई को हटाना

डेटाबेस से किसी उत्पाद को हटाने के लिए क्लाइंट को सक्षम करने के लिए, निम्न विधि जोड़ें ProductController

public async Task<IHttpActionResult> Delete([FromODataUri] int key)
{
    var product = await db.Products.FindAsync(key);
    if (product == null)
    {
        return NotFound();
    }
    db.Products.Remove(product);
    await db.SaveChangesAsync();
    return StatusCode(HttpStatusCode.NoContent);
}


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow