Tworzenie pojedynczego elementu w protokole OData v4 przy użyciu interfejsu Web API 2,2

Autor Zoe Luo

Tradycyjnie można uzyskać dostęp do jednostki tylko wtedy, gdy została ona Zahermetyzowana wewnątrz zestawu jednostek. Jednak usługa OData v4 oferuje dwie dodatkowe opcje, pojedyncze i zawierające, z których każdy obsługuje WebAPI 2,2.

W tym artykule przedstawiono sposób definiowania pojedynczego elementu w punkcie końcowym OData w interfejsie Web API 2,2. Aby uzyskać informacje na temat tego, co to jest pojedynczy i jak można korzystać z niego, zobacz Używanie pojedynczych do definiowania podmiotu specjalnego. Aby utworzyć punkt końcowy usługi OData v4 w interfejsie API sieci Web, zobacz Tworzenie punktu końcowego OData v4 przy użyciu ASP.NET Web API 2,2.

Utworzymy singleton w projekcie interfejsu API sieci Web przy użyciu następującego modelu danych:

model danych

Pojedyncze nazwane Umbrella zostanie zdefiniowane na podstawie typu Company, a zestaw jednostek o nazwie Employees zostanie zdefiniowany w oparciu o typ Employee.

Rozwiązanie używane w tym samouczku można pobrać z CodePlex.

Zdefiniowanie modelu danych

  1. Zdefiniuj typy CLR.

    /// <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. Generuj model modelu EDM na podstawie typów CLR.

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

    W tym miejscu builder.Singleton<Company>("Umbrella") nakazuje konstruktorowi modelu tworzenie pojedynczych nazwanych Umbrella w modelu EDM.

    Wygenerowane metadane będą wyglądać następująco:

    <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>
    

    Z metadanych możemy zobaczyć, że właściwość nawigacji Company w zestawie jednostek Employees jest powiązana z Umbrellapojedynczym. Powiązanie jest wykonywane automatycznie przez ODataConventionModelBuilder, ponieważ tylko Umbrella ma typ Company. Jeśli w modelu występuje jakakolwiek niejednoznaczność, można użyć HasSingletonBinding, aby jawnie powiązać właściwość nawigacji z pojedynczą; HasSingletonBinding ma ten sam efekt, co użycie atrybutu Singleton w definicji typu CLR:

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

Zdefiniuj kontroler singleton

Podobnie jak kontroler obiektów EntitySet, kontroler singleton dziedziczy po ODataController, a nazwa kontrolera singleton powinna być [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>()
        };
    } 
}

W celu obsługi różnych rodzajów żądań akcje muszą być wstępnie zdefiniowane w kontrolerze. Routing atrybutu jest domyślnie włączony w WebAPI 2,2. Na przykład, aby zdefiniować akcję do obsługi zapytań Revenue z Company przy użyciu routingu atrybutów, należy wykonać następujące czynności:

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

Jeśli nie chcesz definiować atrybutów dla każdej akcji, po prostu Zdefiniuj swoje działania zgodnie z konwencjami routingu OData. Ponieważ klucz nie jest wymagany do wykonywania zapytań dotyczących pojedynczych, akcje zdefiniowane w kontrolerze pojedynczym różnią się nieco od akcji zdefiniowanych w kontrolerze obiektu EntitySet.

W przypadku odwołania, sygnatury metod dla każdej definicji akcji w kontrolerze singleton są wymienione poniżej.

// 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()

Zasadniczo należy to zrobić po stronie usługi. Przykładowy projekt zawiera cały kod rozwiązania i klienta OData, który pokazuje, jak używać pojedynczej. Klient został utworzony przez wykonanie kroków opisanych w temacie Tworzenie aplikacji klienckiej OData v4.

.

Dzięki Leo hu w odniesieniu do oryginalnej zawartości tego artykułu.