2013-11-14 3 views
5

UI에서 사용되지 않는 많은 필드가 엔터티에 포함되어 있으므로 내 OData 컨트롤러에서 DTF로 변환합니다.ASP.NET OData - 데이터 전송 개체가있는 데이터 전송 개체가있는 패치 구현

이 질문과 대답 (ASP.NET WebApi OData support for DTOs)은 OData URI의 쿼리 옵션을 EF 쿼리에 적용하고 DTO를 반환하는 방법을 보여줍니다. 이것은 위대합니다. 즉, DB를 쿼리하는 이점과 작은 엔터티를 직렬화하는 이점을 얻게됩니다.

그러나 업데이트 할 때 필자의 패치 된 필드가있는 델타를 내 엔터티에 어떻게 적용합니까?

엔티티의 필드 이름이 DTO와 일치하지 않습니다.

델타에서 변경된 필드 컬렉션을 사용할 수 있지만 모든 필드 이름을 매핑하고 리플렉션을 사용하여 엔터티의 모든 속성을 업데이트합니다.

더 좋은 방법이 있습니까?

DTO 대신 엔티티를 사용해야하고 odata $ select 매개 변수를 사용하여 데이터의 크기를 줄여야합니까?

난 그냥 WebAPI로 되돌릴 예를 UpdateStartDate (INT의 ID, 날짜 시간 newStartDate)

+0

매핑을 정의하는 데 automapper를 사용하고 있습니까? –

+0

예 매핑에 AutoMapper를 사용하고 있습니다. – BenCr

답변

3

난 그냥 같은 문제로 실행하고 발견 한 경우에만 필요한 매개 변수를 개별 업데이트 기능을 가지고해야 다음 링크를 참조하십시오 : http://qimata.com/?p=1381

번영을 기하기 위해 AutoMapper를 사용하여 데이터베이스 엔터티를 DTO에 매핑하는 코드는 다음에 DTO 개체에 패치를 적용한 다음 AutoMapper를 사용하여 다시 매핑합니다 저장하기 전에 데이터베이스 엔티티에 :

[AcceptVerbs("PATCH", "MERGE")] 
public virtual async Task<IHttpActionResult> Patch([FromODataUri] int key, Delta<DtoEntity> delta, CancellationToken cancellationToken) 
{ 
    Validate(delta.GetEntity()); 

    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 

    var entity = await _genericRepository.FindAsync(cancellationToken, key); 
    var dto = Mapper.Map<DtoEntity>(entity); 
    delta.Patch(dto); 
    Mapper.Map(dto, entity); 
    await _context.SaveChangesAsync(cancellationToken); 
    return Updated(dto); 
} 

언급 할 가치가있는 다른 한 가지는 EntityFramework에서 AutoMapper를 사용할 때 탐색 속성의 자동 확장에주의해야한다는 것입니다. 당신은 ExplicitExpansion 방법을 사용하여 확장을 해제 할 수 있습니다 :

Mapper.CreateMap<DbEntity, DtoEntity>() 
      .ForMember(dest => dest.Example, opt => opt.ExplicitExpansion()); 

나는 또한 내 DbContext 생성자에 Configuration.LazyLoadingEnabled = false;과 게으른로드를 해제했다.