2014-04-09 4 views
7

OData 쿼리를 허용하는 Asp.Net 웹 API 응용 프로그램에 ODataController가 있습니다. 나는 읽기만 허용하고 업데이트는 허용하지 않습니다. 데이터 모델을 직접 노출하는 대신 DTO 집합을 만들었습니다. DTO의 등록 정보 이름은 EF 모델의 등록 정보와 반드시 일치하지는 않습니다. 이로 인해 EF 모델에 대해 OData 쿼리를 사용하려고하면 문제가 발생합니다. 이 주제에 대한 StackOverflow의 다른 게시물을 살펴 보았지만 그 중 아무 것도이 문제를 해결하지 못하는 것 같습니다. 나는 선택하거나 필터에서 특정 필드를 참조 할 때까지DTO에 대한 OData 쿼리를 EF 엔터티에 매핑하는 방법은 무엇입니까?

public IQueryable<Customer> GetCustomer(ODataQueryOptions<Customer> query) 
{ 
     ODataModelBuilder builder = new ODataConventionModelBuilder(); 
     builder.EntitySet<Customer>("Customers"); 
     builder.EntitySet<RECORD>("Records"); 
     builder.Namespace = "MyDataService.Models"; 

     var opts = new ODataQueryOptions<RECORD>(new ODataQueryContext(builder.GetEdmModel(), typeof(RECORD)), this.ActionContext.Request); 
     var records = (IQueryable<RECORD>)opts.ApplyTo(db.RECORDS); 
     return ConvertToCustomerList(records); 
} 

이 작동 : 여기

내가 지금 가지고있는 것입니다. OData 쿼리에서 필드를 참조하자마자 - Could not find a property named 'LastName' on type 'MyDataService.Models.RECORD과 같은 ODataException이 발생합니다. EF 속성에는 다른 명명 규칙이 있기 때문입니다. 이 경우 'LAST_NAME'을 (를) 사용해야합니다.

쿼리를 구문 분석 한 다음 필드 참조를 올바른 이름으로 바꿔야하는 것처럼 보입니다. ODataUriParser가 도움이 될 것 같았지만 희망만큼 깨끗하지 못했습니다.

누구든지 내게이 문제를 해결하기위한 지침을 제공 할 수 있습니까? 더 나은 접근 방법이 있습니까?

답변

5

WebApi OData 새 기능 모델 별칭을 사용하면 문제가 해결 될 수 있습니다. Edm Model과 aDTO간에 동일한 이름을 사용할 필요는 없습니다. 예를 들어, 속성 이름 OrderDto.Total이 있지만, EDM 모델에이 Order.Check

 ODataModelBuilder builder = new ODataConventionModelBuilder(); 
     builder.ModelAliasingEnabled = true; 

     EntitySetConfiguration<CustomerDto> customers = builder.EntitySet<CustomerDto>("Customers"); 
     EntitySetConfiguration<OrderDto> orders = builder.EntitySet<OrderDto>("Orders"); 
     orders.EntityType.Name = "Order"; 
     orders.EntityType.Property(p => p.Total).Name = "Check"; 
     return builder.GetEdmModel(); 

https://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/

+0

덕분에 ODataModelAliasingSample을 참조하시기 바랍니다 된다. 이것은 매우 도움이되었습니다. 이것은 현재 출시 전 버전에서만 제공되고 있지만 유망 해 보입니다. 또한 모델의 DataContract 및 DataMember 특성을 사용하여 별칭을 정의 할 수 있습니다. – BenR

+2

또한 ModelAliasingEnabled 속성은 최신 버전에서 사용되지 않지만 앨리어싱은 여전히 ​​작동한다고 생각합니다. – BenR

+0

ApiController에서 OData 쿼리를 구현할 때도이 별칭을 사용할 수 있습니까? –

관련 문제