簡體   English   中英

Odata沒有找到NavigationLink工廠

[英]Odata No NavigationLink factory was found

我目前正在開發mvc4 web api odata服務,我希望返回用戶列表中的用戶列表。 當我想要獲得用戶時,我收到以下錯誤:

錯誤:

<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 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的UsersController看起來像這樣:

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);
    }
}

我正在調用我在我的路由中設置的以下網址: http://127.0.0.1:81/odata/Usershttp://127.0.0.1:81/odata/Usershttp://127.0.0.1:81/odata/Users用戶如果我在我的用戶模型中評論導航屬性,它可以工作。

我究竟做錯了什么? 我已經嘗試將[Serializable,KnownType(typeof(Language))]放在我的用戶類之上但由於某種原因我不能使用KnownType。 如何使用此導航屬性使我的OData工作?

您缺少為語言設置的實體。 導航屬性指向實體,必須綁定到實體集。 在模型構建器代碼中,添加此行以解決問題。

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

這樣做是為了創建實體集'languages'。 約定模型構建器將導航屬性綁定到實體集(如果有)。 因此,實體類型User上的導航屬性Languages將綁定到實體集languages

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM