재우니의 블로그

weblogs.asp.net/ricardoperes/asp-net-core-odata-part-1

 

ASP.NET Core OData Part 1

 

weblogs.asp.net

weblogs.asp.net/ricardoperes/asp-net-core-odata-part-2

 

ASP.NET Core OData Part 2

 

weblogs.asp.net

weblogs.asp.net/ricardoperes/asp-net-core-odata-part-3

 

ASP.NET Core OData Part 3

ASP.NET Core OData Part 3 Introduction This will be the third post on OData and ASP.NET Core 3. Please find the first post (basics) here and the second post (querying) here. This time, I will talk about actions and functions. For demo purposes, let’s con

weblogs.asp.net

aspdotnet.tistory.com/2563

 

ASP.NET 5.0 WEB API 에 OData 구축 적용해보기

www.youtube.com/watch?v=1oA6XxmYAA0 위의 유투브강좌를 보면서 구축한 내용이며, .NET 5 를 2020.12.28 일자 적용해 봤습니다. 설치는 아래와 같이 3개 정도 진행하였으며, 유투브 강좌보다 Microsoft.AspNetCor..

aspdotnet.tistory.com

 

ASP.NET Core OData Part 1

 

 

소개

 

OData  객체 지향 도메인 모델을 HTTP REST 인터페이스 로 사용할 수 있도록 하는 개방형 표준 입니다 . 간단히 말해서, HTTP 요청의 결과로 도메인 모델을 반환하고, URL을 통해 쿼리하고, 함수 및 작업을 생성하기 위한 specification 을 제공합니다. 

많은 사람들이 OData에 대해 알지 못하며, ASP.NET Core에서 OData를 사용하는 것에 대한 주의 사항과 문서가 많지 않기 때문에 주제에 대해 몇 가지 게시물을 작성하기로 결정했습니다.

Setting Up

Parent  Child 라는 두 개의 클래스가있는 도메인 모델을 가지고 있다고 가정 해 봅시다 .

또한 Entity Framework Core 컨텍스트를 제공해야합니다.

public class ParentChildContext : DbContext
{
  public ParentChildContext(DbContextOptions options) : base(options) { }
  public DbSet<Parent> Parents { get; set; }
  public DbSet<Child> Children { get; set; }
}

이에 대해 더 자세히 설명하지 않겠습니다. Entity Framework Core 컨텍스트에 대해 모두 알고 계실 것라 생각합니다.. Microsoft.EntityFrameworkCore NuGet 패키지 에 대한 참조를 추가 하거나 SQL Server를 사용하는 경우 Microsoft.EntityFrameworkCore.SqlServer 를 추가하세요 . 이제 ConfigureServices 메소드에서 컨텍스트를 DI framework 에 등록합니다.

services.AddDbContext<ParentChildContext>(options =>
{
  options.UseSqlServer(“<connection string>”);
});

ASP.NET Core 프로젝트에서 Microsoft.AspNetCore.OData NuGet 패키지에 대한 참조를 추가해야 합니다. 여기에는 ASP.NET Core 용 OData 버전 4의 server-side 구현이 포함됩니다.

ConfigureServices 메소드 에서 필수 서비스를 추가해야합니다 .

services.AddOData ();

services 를 등록하지만 이제 실제 domain model 에 대한 endpoint 를 추가해야합니다. ASP.NET Core OData는 이제 엔드 포인트 라우팅을 지원하므로 모든 것이 원활하게 수행 될 수 있습니다.

app.UseEndpoints(endpoints =>
{ 
  endpoints.MapODataRoute(“odata”, “odata”, GetEdmModel(app.ApplicationServices)); 
});

endpoint  odata (첫 번째 매개 변수) 라는 이름으로 등록 하고 동일한 접두사 (두 번째 매개 변수)를 사용하여 쉽게 변경할 수 있습니다.  경로에서 EDM 데이터 모델을 반환합니다 . 우리는 이것을 다음과 같이 만듭니다 :

private static IEdmModel GetEdmModel(IServiceProvider serviceProvider)
{
  var builder = new ODataConventionModelBuilder(serviceProvider);
  builder.EntitySet<Parent>(“Parents”);
  builder.EntitySet<Child>(“Children”);
  return builder.GetEdmModel();
}

주목할 것은 이것이 conventions-based model builder 인 ODataConventionModelBuilder 입니다. 이것은 각 엔티티에 대해 id 속성을 유추하는 것과 같은 몇 가지 사항을 처리하므로 명시 적으로 명시 할 필요가 없습니다. 엔티티에 Id 또는 EntityId 이외의 재미있는 이름의 id 특성이있는 경우 이를 지정해야합니다.

builder
.EntitySet<Parent>(“Parents”)
.EntityType
.HasKey(x => x.Id);

다른 특성은 모두 일반 매개 변수에서 자동으로 추론되므로 다른 특성을 지정할 필요가 없습니다.

제공 한 엔티티 세트 이름을 명심하십시오. 엔티티 이름의 복수 형식을 갖는 것이 일반적이지만 필수는 아닙니다.

이제 이것을 노출시키는 컨트롤러를 만들어야합니다. 최소한 두 가지 방법이 필요합니다.

[ODataRoutePrefix(“Parents”)]
public class ParentController : ODataController
{
  private ParentChildContext _ctx;

  public ParentController(ParentChildContext ctx)
  {
    this._ctx = ctx;
  }

  [ODataRoute]
  public IQueryable<Parent> Get()
  {
    return this._ctx.Parents.AsQueryable();
  }

  [ODataRoute(“{id}”)]
  public Parent Get([FromODataUri] int id)
  {
    return this._ctx.Parents.Find(id);
  }
}

이 컨트롤러는 Parents 엔터티 집합에 따라 다르므로 원하는 경우 Children에 대해 다른 컨트롤러가 있어야합니다 . 이것은 [ ODataRoutePrefix ] 속성에 지정됩니다 .

또한 매개 변수를 사용하지 않는 Get 작업 메서드와 다른 하나의 Parents 를 사용하여 IQueryable <Parent>  반환하는 방법에 주목 하십시오 . IActionResult 또는 ActionResult <T>를 선언 할 수도 있습니다 .

[ODataRoute]
public IActionResult Get()
{
  return this.Ok(this._ctx.Parents.AsQueryable());
}

//alternative
[ODataRoute]
public ActionResult<IQueryable<Parent>> Get()
{
  return this.Ok(this._ctx.Parents.AsQueryable());
}

후자는 ActionResult <T> 를 사용 하는 장점이 있으며 여기에서 읽을 수있는 몇 가지 장점이 있습니다 .

물론 모든 메소드도 비동기식으로 만들 수 있습니다.

[ODataRoute]
public async Task<IQueryable<Parent>> Get()
{
  return await this._ctx.Parents.ToListAsync();
}

[ODataRoute(“{id}”)]
public async Task<Parent> Get([FromODataUri] int id)
{
  return await this._ctx.Parents.FindAsync(id);
}

다음 포스트에서 첫 번째 방법의 구현에 문제가있을 것입니다.

이제 매개 변수가없는 첫 번째 메소드는 데이터베이스의 모든 엔티티를 리턴하고 두 번째 메소드는 예상대로 id 특성에서 하나를 리턴합니다.

결론

모두 완료되었으므로 방금 생성 한 endpoints 에 액세스하고 다음 URL로 이동해보십시오.

  • /odata : 노출 된 엔터티 집합 ( Parents 및 Children)에 대한 정보를 반환합니다.

  • /odata /parents –> ParentController.Get() : Parent 엔터티에 대한 모든 레코드를 반환합니다

  • /odata /parents (1) –> ParentController.Get(1) : Parent 엔터티 의 지정된 기본 키에 대해 데이터베이스에 레코드가 있으면 하나의 레코드를 반환합니다.

이것은 매우 기본적인 내용이며, 향후 게시물에서 URL 쿼리 및 함수 및 작업 생성과 같은 다른 옵션을 살펴볼 것입니다.

참고 문헌

다음 페이지에서 자세한 정보를 찾을 수 있습니다.