【问题标题】:Odata No NavigationLink factory was foundOdata 未找到 NavigationLink 工厂
【发布时间】:2013-04-15 22:50:40
【问题描述】:

我目前正在开发一个 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 用户控制器如下所示:

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/Users 如果我在我的用户模型中评论导航属性,它会起作用。

我做错了什么?我已经尝试将 [Serializable, KnownType(typeof(Language))] 放在我的用户类之上,但由于某种原因我不能使用 KnownType。如何让我的 OData 使用此导航属性?

【问题讨论】:

    标签: c# asp.net-web-api odata


    【解决方案1】:

    您缺少语言的实体集。导航属性指向一个实体,并且必须绑定到一个实体集。在您的模型构建器代码中,添加此行以解决问题。

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

    这样做是为了创建实体集“语言”。如果存在实体集,则约定模型构建器将导航属性绑定到实体集。因此,实体类型User 上的导航属性Languages 将绑定到实体集languages

    【讨论】:

    • 感谢您确实完成了这项工作,并且不再出现错误!它不会返回 odata 结果中的语言,你知道这是为什么吗?我一直在阅读有关扩展查询的信息,但它似乎不起作用。
    • OData 默认不展开关系。它们被表示为链接。要在查询用户时获取相关语言,您需要使用 uri http://localhost/odata/Users?$expand=Languages。查看odata.org/documentation/odata-v3-documentation/url-conventions/…的文档
    • 如果我们不想为语言提供实体集来简化我们的 API 怎么办,有没有使用 HasNavigationPropertyLink 的示例?
    • OData V3 不允许您这样做。 languages 必须作为根级实体集公开。但是,当有人访问该实体集时,您可以随意返回 404
    • 当有人访问实体集时如何返回 404。特别是当他们作为 $expand 属性访问它时
    猜你喜欢
    • 1970-01-01
    • 2017-04-11
    • 2019-03-13
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2011-12-14
    相关资源
    最近更新 更多