Web API 2,2 kullanarak tek bir OData v4 oluşturmaCreate a Singleton in OData v4 Using Web API 2.2

Zoe Luo tarafındanby Zoe Luo

Geleneksel olarak, bir varlığa yalnızca bir varlık kümesi içinde kapsülleniyorsa erişilebilir.Traditionally, an entity could only be accessed if it were encapsulated inside an entity set. Ancak OData v4, her ikisi de hem WebAPI 2,2 ' nin desteklediği iki ek seçenek sunar.But OData v4 provides two additional options, Singleton and Containment, both of which WebAPI 2.2 supports.

Bu makalede, Web API 2,2 ' de bir OData uç noktasında tekil nasıl tanımlanacağı gösterilmektedir.This article shows how to define a singleton in an OData endpoint in Web API 2.2. Tekil nedir ve bunu kullanmanın avantajlarından faydalanmanız hakkında bilgi edinmek için, bkz. özel varlığınızı tanımlamak için tek tek kullanma.For information on what a singleton is and how you can benefit from using it, see Using a singleton to define your special entity. Web API 'de OData v4 uç noktası oluşturmak için, bkz. ASP.NET Web apı 2,2 kullanarak OData v4 uç noktası oluşturma.To create an OData V4 endpoint in Web API, see Create an OData v4 Endpoint Using ASP.NET Web API 2.2.

Aşağıdaki veri modelini kullanarak Web API projenizde tek bir oluşturacak:We'll create a singleton in your Web API project using the following data model:

Veri Modeli

Tek bir adlandırılmış Umbrella Companytürüne göre tanımlanır ve Employees adlı bir varlık kümesi Employeetürüne göre tanımlanır.A singleton named Umbrella will be defined based on type Company, and an entity set named Employees will be defined based on type Employee.

Bu öğreticide kullanılan çözüm CodePlex'ten indirilebilir.The solution used in this tutorial can be downloaded from CodePlex.

Veri modelini tanımlamaDefine the data model

  1. CLR türlerini tanımlayın.Define the CLR types.

    /// <summary> 
    /// Present the EntityType "Employee" 
    /// </summary> 
    public class Employee 
    {     
        public int ID { get; set; }     
        public string Name { get; set; }  
       
        [Singleton]     
        public Company Company { get; set; } 
    } 
    /// <summary> 
    /// Present company category, which is an enum type 
    /// </summary> 
    public enum CompanyCategory 
    { 
        IT = 0,     
        Communication = 1,     
        Electronics = 2,     
        Others = 3 
    } 
    /// <summary> 
    /// Present the EntityType "Company" 
    /// </summary> 
    public class Company 
    {
         public int ID { get; set; }
         public string Name { get; set; }
         public Int64 Revenue { get; set; }
         public CompanyCategory Category { get; set; }
         public List<Employee> Employees { get; set; } 
    }
    
  2. CLR türlerini temel alan EDM modelini oluşturun.Generate the EDM model based on the CLR types.

    public static IEdmModel GetEdmModel() 
    { 
        ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntitySet<Employee>("Employees"); builder.Singleton<Company>("Umbrella");
        builder.Namespace = typeof(Company).Namespace;
        return builder.GetEdmModel(); 
    }
    

    Burada builder.Singleton<Company>("Umbrella"), model oluşturucunun EDM modelinde tek bir adlandırılmış Umbrella oluşturmasını söyler.Here, builder.Singleton<Company>("Umbrella") tells the model builder to create a singleton named Umbrella in the EDM model.

    Oluşturulan meta veriler aşağıdaki gibi görünür:The generated metadata will look like the following:

    <EntityContainer Name="Container"> 
      <EntitySet Name="Employees" EntityType="ODataSingletonSample.Employee"> 
        <NavigationPropertyBinding Path="Company" Target="Umbrella"/> 
      </EntitySet> 
      <Singleton Name="Umbrella" Type="ODataSingletonSample.Company"> 
        <NavigationPropertyBinding Path="Employees" Target="Employees"/> 
      </Singleton> 
    </EntityContainer>
    

    Meta verilerden, Employees varlık kümesindeki Gezinti özelliğinin Company Singleton Umbrellabağlandığını görebiliriz.From the metadata we can see that the navigation property Company in the Employees entity set is bound to the singleton Umbrella. Yalnızca Umbrella Company türüne sahip olduğundan bağlama ODataConventionModelBuildertarafından otomatik olarak gerçekleştirilir.The binding is done automatically by ODataConventionModelBuilder, since only Umbrella has the Company type. Modelde belirsizlik varsa, bir gezinti özelliğini açıkça tek bir şekilde bağlamak için HasSingletonBinding kullanabilirsiniz. HasSingletonBinding, CLR tür tanımında Singleton özniteliği ile aynı etkiye sahiptir:If there is any ambiguity in the model, you can use HasSingletonBinding to explicitly bind a navigation property to a singleton; HasSingletonBinding has the same effect as using the Singleton attribute in the CLR type definition:

    EntitySetConfiguration<Employee> employeesConfiguration = 
        builder.EntitySet<Employee>("Employees"); 
    employeesConfiguration.HasSingletonBinding(c => c.Company, "Umbrella");
    

Tek denetleyiciyi tanımlamaDefine the singleton controller

EntitySet denetleyicisi gibi, tek denetleyici ODataControllerdevralır ve tek denetleyici adı [singletonName]Controllerolmalıdır.Like the EntitySet controller, the singleton controller inherits from ODataController, and the singleton controller name should be [singletonName]Controller.

public class UmbrellaController : ODataController 
{
    public static Company Umbrella;
    static UmbrellaController()
    {
        InitData();
    }
    private static void InitData()
    {
        Umbrella = new Company()
        {
            ID = 1,
            Name = "Umbrella",
            Revenue = 1000,
            Category = CompanyCategory.Communication,
            Employees = new List<Employee>()
        };
    } 
}

Farklı istek türlerini işlemek için, denetleyicide önceden tanımlanmış olması gerekir.In order to handle different kinds of requests, actions are required to be pre-defined in the controller. Varsayılan olarak, WebApi 2,2 ' de öznitelik yönlendirme etkindir.Attribute routing is enabled by default in WebApi 2.2. Örneğin, öznitelik yönlendirme kullanarak Company Revenue sorgulamayı işlemeye yönelik bir eylem tanımlamak için aşağıdakileri kullanın:For example, to define an action to handle querying Revenue from Company using attribute routing, use the following:

[ODataRoute("Umbrella/Revenue")] 
public IHttpActionResult GetCompanyRevenue() 
{
     return Ok(Umbrella.Revenue); 
}

Her bir eylem için öznitelikleri tanımlamanızı istemiyorsanız, yalnızca, OData yönlendirme kurallarınıizleyen eylemlerinizi tanımlamanız yeterlidir.If you are not willing to define attributes for each action, just define your actions following OData Routing Conventions. Tek bir sorgulama için anahtar gerekli olmadığından, tek denetleyicide tanımlanan eylemler, EntitySet denetleyicisinde tanımlanan eylemlerden biraz farklıdır.Since a key is not required for querying a singleton, the actions defined in the singleton controller are slightly different from actions defined in the entityset controller.

Başvuru için, tek denetleyicideki her eylem tanımı için yöntem imzaları aşağıda listelenmiştir.For reference, method signatures for every action definition in the singleton controller are listed below.

// Get Singleton 
// ~/singleton 
public IHttpActionResult Get() 
public IHttpActionResult GetUmbrella() 

// Get Singleton 
// ~/singleton/cast 
public IHttpActionResult GetFromSubCompany() 
public IHttpActionResult GetUmbrellaFromSubCompany() 

// Get Singleton Property 
// ~/singleton/property  
public IHttpActionResult GetName() 
public IHttpActionResult GetNameFromCompany() 

// Get Singleton Navigation Property 
// ~/singleton/navigation  
public IHttpActionResult GetEmployees() 
public IHttpActionResult GetEmployeesFromCompany() 

// Update singleton by PUT 
// PUT ~/singleton 
public IHttpActionResult Put(Company newCompany) 
public IHttpActionResult PutUmbrella(Company newCompany) 

// Update singleton by Patch 
// PATCH ~/singleton 
public IHttpActionResult Patch(Delta<Company> item) 
public IHttpActionResult PatchUmbrella(Delta<Company> item) 

// Add navigation link to singleton 
// POST ~/singleton/navigation/$ref 
public IHttpActionResult CreateRef(string navigationProperty, [FromBody] Uri link) 

// Delete navigation link from singleton 
// DELETE ~/singleton/navigation/$ref?$id=~/relatedKey 
public IHttpActionResult DeleteRef(string relatedKey, string navigationProperty) 

// Add a new entity to singleton navigation property 
// POST ~/singleton/navigation 
public IHttpActionResult PostToEmployees([FromBody] Employee employee) 

// Call function bounded to singleton 
// GET ~/singleton/function() 
public IHttpActionResult GetEmployeesCount()

Temel olarak, hizmet tarafında yapmanız gereken tek şey budur.Basically, this is all you need to do on the service side. Örnek proje , çözümün ve tek tek 'nın nasıl kullanılacağını gösteren OData istemcisinin tüm kodlarını içerir.The sample project contains all of the code for the solution and the OData client that shows how to use the singleton. İstemci, OData v4 Istemci uygulaması oluşturmabölümündeki adımları izleyerek oluşturulur.The client is built by following the steps in Create an OData v4 Client App.

arasında yetersiz alanla karşılaştı..

Bu makalenin özgün içeriği için yem hu için teşekkürler.Thanks to Leo Hu for the original content of this article.