2013-07-08 3 views
1

저는 현재 기존 Web API 프로젝트에서 OData의 가능성을 확인하는 중입니다. 코드 사용 먼저 모든 모델을 처음부터 새로 작성하여 절대적인 제어권을 갖습니다. 그러나 탐색 속성을 코드에 추가 했더라도 OData에서 제공하는 메타 데이터 링크를 통해 스키마를 검사 할 때 일부는 스키마에 없습니다. 나는이에 GET 요청을 수행 할 때 이제기존 탐색 속성이 누락되었습니다.

[DataContract] 
[KnownType(typeof(User))] 
public abstract class Person 
{ 
    [DataMember] 
    public int ID { get; set; } 
    [DataMember] 
    public string Name { get; set; } 
    [DataMember] 
    public Nullable<int> CountryID { get; set; } 
    [DataMember] 
    public Nullable<int> RelationID { get; set; } 

    public virtual Country Country { get; set; } 
    public virtual Relation Relation { get; set; } 
} 

, (그 문제 또는 /Country) /User(1284)/Relation를 사용하여 내가 정확히 얻을 :

예를 들어, 나는 Person 클래스에서 상속되는 사용자 클래스가 내가 원하는 관계 또는 국가 수업. 그러나 문제는이 연관이 없기 때문에 /Relation(16)/Country으로 전화 할 수 없다는 것입니다.

[DataContract] 
public class Relation 
{ 
    [DataMember] 
    public int ID { get; set; } 
    [DataMember] 
    public string Number { get; set; } 
    [DataMember] 
    public string Serial { get; set; } 
    [DataMember] 
    public Nullable<int> CountryID { get; set; } 

    public virtual Country Country { get; set; } 
    public virtual List<User> Users { get; set; } 
} 

그러나 알다시피, 내 관계 클래스에서 확실히 그러한 탐색 속성이 있습니다. 당신이 DbContext 클래스를 볼 때 또한 :

public DbSet<Relation> Relations { get; set; } 
    public DbSet<Country> Countries { get; set; } 
    public DbSet<User> Users { get; set; } 

및 WebApiConfig이

ODataModelBuilder modelBuilder = new ODataConventionModelBuilder(); 
    modelBuilder.EntitySet<Relation>("Relations"); 
    modelBuilder.EntitySet<Country>("Countries"); 
    modelBuilder.EntitySet<User>("Users"); 

당신은 사실 관계 및 사용자가 탐색 특성면에서 거의 동일하다는 것을 볼 수있다, 적어도 국가들은 동일 .

만, 내가 말했듯이, 나는 중 하나로, OData 자체에서 제공되는 메타 데이터를 볼 때 :

당신은 사용자 -> 국가 및 사용자 -이> 관계가 존재하는 것을 볼 수 있지만,
<Association Name="TestProject_Models_User_Country_TestProject_Models_Country_CountryPartner"> 
    <End Type="TestProject.Models.Country" Role="Country" Multiplicity="0..1" /> 
    <End Type="TestProject.Models.User" Role="CountryPartner" Multiplicity="0..1" /> 
    </Association> 
    <Association Name="TestProject_Models_User_Relation_TestProject_Models_Relation_RelationPartner"> 
    <End Type="TestProject.Models.Relation" Role="Relation" Multiplicity="0..1" /> 
    <End Type="TestProject.Models.User" Role="RelationPartner" Multiplicity="0..1" /> 
    </Association> 

나라의 관계의 협회 사용자가 누락되었습니다. 그러나 데이터베이스에서 이러한 관계가 존재하고 외래 키가 제자리에 있습니다. NuGet 콘솔에서 Update-Database를 실행할 때 수행 할 코드 업데이트가 없다는 알림을받습니다.

저는 이미 전체 데이터베이스를 삭제했으며 CodeFirst가 모든 것을 다시 만들도록했습니다. OData의 최신 안정적 빌드 (4.0.0에서 4.0.30506까지)로 업데이트되었지만, 아쉽게도 아무 것도 작동하지 않습니다.

나를 따라갈 사람이 있습니까? 미리 감사드립니다!

+0

$ 메타 데이터 문서에서 관계 유형 정의에 'TestProject_Models_User_Relation_TestProject_Models_Relation_RelationPartner' 연관을 참조하는 탐색 속성이 있습니까? 사용자 유형 정의에 이러한 탐색 속성이 있다고 가정합니다. –

답변

2

클래스가 [DataContract]으로 표시되면 모델 작성자는 [DataMember]으로 표시된 공용 속성 만 선택합니다. 따라서 모델 작성자가 내비게이션 속성 CountryRelationUser에 어떻게 알아 냈는지 잘 모르겠습니다.

물론 모델 작성자가 추측 할 수없는 탐색 속성을 명시 적으로 말할 수 있습니다. 샘플 코드,

var relations = modelBuilder.EntitySet<Relation>("Relations"); 
var countries = modelBuilder.EntitySet<Country>("Countries"); 
var users = modelBuilder.EntitySet<User>("Users"); 
users.HasRequiredBinding(u => u.Country, countries); 
users.HasRequiredBinding(u => u.Relation, relations); 
relations.HasRequiredBinding(r => r.Country, countries); 
relations.HasManyBinding(r => r.Users, users); 

다른 방법은 DataMember를 모델 빌더가 자동으로 알아낼 수 있도록뿐만 아니라 탐색 속성에 속성을 추가하는 것입니다.

+0

첫 번째 제안은 하나였습니다!나는 네비게이션 속성에'[DataMember]를 추가하는 것이 중요하지 않을 것이라는 가정하에있었습니다. 왜냐하면 그것을 엄격하게 속성이 아니라는 것을 알았 기 때문입니다 (당연히 바보입니다). 또한 사용자가 이러한 특성을 갖고 있지 않기 때문에 관계에 추가하는 것이 중요하지 않다고 생각했습니다. 하지만 도움이 되었어요. 고마워요! – Kazu

관련 문제