2013-04-22 5 views
9

現在、mvc4 web api odataサービスで作業しています。ここでは、ユーザーが言語のリストを持っているユーザーの一覧を返したいと考えています。私は、私は次のエラーを取得するユーザーを取得したいときは:Odata NavigationLinkファクトリが見つかりません

エラー:

public class User 
{ 
    [Key] 
    public int UserId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string UserName { get; set; } 

    public string Password { get; set; } 
    public virtual ICollection<Language> Languages { get; set; } 

    public User() 
    { 
     Languages = new List<Language>(); 
    } 
} 

とのODataルックスのために私がUserController:

<m:innererror> 
<m:message> 
The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; charset=utf-8'. 
</m:message> 
<m:type>System.InvalidOperationException</m:type> 
<m:stacktrace/> 
<m:internalexception> 
<m:message> 
No NavigationLink factory was found for the navigation property 'Languages' from entity type 'MvcWebRole1.Models.User' on entity set 'Users'. Try calling HasNavigationPropertyLink on the EntitySetConfiguration. 
Parameter name: navigationProperty 
</m:message> 
<m:type>System.ArgumentException</m:type> 
<m:stacktrace> 
at System.Web.Http.OData.Builder.EntitySetLinkBuilderAnnotation.BuildNavigationLink(EntityInstanceContext instanceContext, IEdmNavigationProperty navigationProperty, ODataMetadataLevel metadataLevel) 
at System.Web.Http.OData.Formatter.Serialization.ODataEntityTypeSerializer.WriteNavigationLinks(EntityInstanceContext context, ODataWriter writer, ODataSerializerContext writeContext) 
at System.Web.Http.OData.Formatter.Serialization.ODataEntityTypeSerializer.WriteEntry(Object graph, IEnumerable`1 propertyBag, ODataWriter writer, ODataSerializerContext writeContext) 
at System.Web.Http.OData.Formatter.Serialization.ODataEntityTypeSerializer.WriteObjectInline(Object graph, ODataWriter writer, ODataSerializerContext writeContext) 
at System.Web.Http.OData.Formatter.Serialization.ODataFeedSerializer.WriteFeed(Object graph, ODataWriter writer, ODataSerializerContext writeContext) 
at System.Web.Http.OData.Formatter.Serialization.ODataFeedSerializer.WriteObjectInline(Object graph, ODataWriter writer, ODataSerializerContext writeContext) 
at System.Web.Http.OData.Formatter.Serialization.ODataFeedSerializer.WriteObject(Object graph, ODataMessageWriter messageWriter, ODataSerializerContext writeContext) 
at System.Web.Http.OData.Formatter.ODataMediaTypeFormatter.<>c__DisplayClassa.<WriteToStreamAsync>b__9() 
at System.Threading.Tasks.TaskHelpers.RunSynchronously(Action action, CancellationToken token) 
</m:stacktrace> 
</m:internalexception> 
</m:innererror> 

私のユーザーは、このようになりますこのように:

public class UsersController : EntitySetController<User, int> 
{ 
    WorldChatContext db = new WorldChatContext(); 

    public override IQueryable<User> Get() 
    { 
     return db.Users.AsQueryable(); 
    } 

    protected override User GetEntityByKey(int key) 
    { 
     return db.Users.FirstOrDefault(p => p.UserId == key); 
    } 

    public override HttpResponseMessage Post(User entity) 
    { 
     db.Users.Add(entity); 
     db.SaveChanges(); 
     return base.Post(entity); 
    } 
} 

ルーティングでセットアップした次のURLを呼び出しています。http://127.0.0.1:81/odata/Usersユーザーモデルのナビゲーションプロパティにコメントすると機能します。

私は間違っていますか?私はすでに[Serializable、KnownType(typeof(Language))]を自分のユーザークラスの上に置くことを試みましたが、何らかの理由でKnownTypeを使用できません。このナビゲーションプロパティでODataを動作させるにはどうすればよいですか?

答えて

32

言語のエンティティセットがありません。ナビゲーションプロパティはエンティティを指し、エンティティセットにバインドする必要があります。モデルビルダーコードで、この行を追加して問題を修正します。

builder.EntitySet<Language>("languages"); 

これは、エンティティセット「言語」を作成することです。コンベンションモデルビルダは、ナビゲーションプロパティをエンティティセットにバインドします(存在する場合)。したがって、エンティティタイプUserのナビゲーションプロパティLanguagesは、エンティティセットlanguagesにバインドされます。

+0

実際に仕事をしてくれてありがとうございました。それはodataの結果で言語を返しませんが、なぜそれが分かりますか?私は拡張クエリについて読んできましたが、うまくいきません。 – Fergers

+1

ODataでは、デフォルトでリレーションシップが展開されません。代わりにリンクとして表示されます。ユーザーを照会しながら関連言語を取得するには、uri http:// localhost/odata/Users?$ expand = Languages'を使用する必要があります。 http://www.odata.org/documentation/odata-v3-documentation/url-conventions/#513_Expand_System_Query_Option –

+0

APIを簡素化するための言語のエンティティセットを提供したくない場合はどうなりますか? HasNavigationPropertyLinkを使用した例はありますか? – Michael

関連する問題