2014-12-03 2 views
15

OData V4가 포함 된 WebAPI 2.2 응용 프로그램이 있습니다. 또한 EF 6.1을 사용하고 있습니다. 내 기관 중 하나에서OData 읽기 전용 속성

내가 계산 된 특성이 있습니다 내 고객에 계산 된 속성을 제공하기 위해

public class Person { 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    // Calculated Property - No setter 
    public string FullName { 
    get { 
     return FirstName + " " + LastName; 
    } 
} 

, 나는 그래서 하나로, OData 모델

public static IEdmModel GetModel() 
    { 
     ODataModelBuilder builder = new ODataConventionModelBuilder(); 
     builder.Namespace = "NavigationServices"; 
     builder.EntityType<Person>; 
     builder.EntityType<Person>().Property(a => a.FullName); // Calculated Property 
     .... 

     return builder.GetEdmModel(); 
    } 

을 등록해야을, 클라이언트 측에서 데이터를 얻을 때 모든 객체에는 Calculated 속성이 있습니다.

그러나 새 요소를 작성하거나 기존 요소를 업데이트 (PUT)하려고하면 내 조치가 요소를 인식하지 못하고 "set method"를 찾지 못한다는 오류가 발생합니다. 재산.

OData (분명히 지원되지 않음)의 읽기 전용 속성에 대한 몇 가지 게시물을 읽었지만 OData를 계산 된 속성과 함께 사용하는 방법을 찾지 못했습니다.

이 상황을 극복하는 방법에 대한 조언이 있습니까?

답변

4

맞습니다. OData은 현재 read-only properties을 지원하지 않습니다.

그러나 read-only entities을 지원합니다.

또는 에 아무런 변화가없는 setter을 추가하여 OData을 속일 수 있습니다.

public class Northwind : DataService<NorthwindEntities> 
{ 
    // This method is called only once to initialize service-wide policies. 
    public static void InitializeService(DataServiceConfiguration config) 
    { 
     config.SetEntitySetAccessRule("Customers", EntitySetRights.AllRead); 
    } 
} 
+0

webapi에서 어떻게 처리 할 수 ​​있습니까? – Shivkumar

+0

빈 setter로 트릭을 시도했습니다. 정확히 내가 무엇을 찾고 있었는지. 고맙습니다. –

+1

@Shivkumar 웹 API에서이 작업을 시도한 결과 빈 세터와 같은 방식으로 작동합니다. –

6

지금 주석을 사용하여 클라이언트와 서버 사이의 계약을 구축하는 것입니다이 작업을 수행하는 부드러운 방법이있다 :

public string FullName 
{ 
    get 
    { 
     return FirstName + " " + LastName; 
    } 
    set 
    { 
     // do nothing 
    } 
} 

이것은 당신이 entity 읽기 전용으로 설정하는 방법입니다.

웹 API 중 하나로, OData에서
<Term Name="Computed" Type="Core.Tag" DefaultValue="true" AppliesTo="Property"> 
    <Annotation Term="Core.Description" String="A value for this property is generated on both insert and update"/> 
</Term> 

는 WebConfig.cs, 당신은 당신의 재산에 같은 주석을 추가하는 등의 코드를 작성 :

ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); 
var model = builder.GetEdmModel() as EdmModel; 
model.SetVocabularyAnnotation(
    new EdmAnnotation(model.EntityContainer.FindEntitySet("People").EntityType().FindProperty("FullName"), 
    new EdmTerm("Org.OData.Core.V1", "Computed", EdmPrimitiveTypeKind.Boolean), 
    new EdmBooleanConstant(true))); 

Core vocabulary of the V4 standard에서

는 등의 용어가 그런 다음 데이터에 다음과 같이 표시됩니다.

<Annotations Target="V4Service.Models.Person/FullName"> 
    <Annotation Term="Org.OData.Core.V1.Computed" Bool="true"/> 
</Annotations> 

서비스는 Person 엔터티의 FullName 속성이 서비스에 의해 계산됨을 알립니다. 그런 다음 POST 및 PATCH 요청에 대한 컨트롤러 메서드에서 FullName 속성에 대해 클라이언트가 보낸 값을 무시하고 자신의 값을 계산할 논리를 가질 수 있습니다.

사용중인 클라이언트가 확실하지 않습니다. OData Client for .NET을 사용하는 경우 특수 효과 값에 대한 지원은 다음 출시에서 제공됩니다. EdmLib을 직접 사용하지 않으려면 주석 값 검색 지원이 이미 추가되었습니다.

+0

주석을 모델에 바로 읽는 것 외에는 지금까지 지원이 없습니다. – LunicLynx

0

클래스 계산 속성 대신 데이터베이스 계산 속성을 사용할 수 있습니다.

This article describes EF and database computed properties. 기사에 비해 샘플 코드에서 볼 수있는 한 가지 차이점은 속성에 설정자가 없다는 것입니다. 당신은 개인 설정

public string FullName { 
    get; 
    private set; 
} 

로 자동 접근 자를 사용하도록 속성을 설정하면 다음 계산 된 컬럼으로 데이터베이스의 열을 만듭니다.

ALTER TABLE dbo.Users ADD FullName AS FirstName + ' ' + LastName 

추가로 odata 및 Linq를 사용하여이 속성에 대해 쿼리 할 수 ​​있습니다.

+0

링크 된 기사에는 OData가 전혀 언급되어 있지 않습니다. –

+0

@CarlBussema - 정확합니다. 나는이 게시물을 오해하지 않도록 재확인했다. –