如何在最新的Web API beta(2013年6月26日)更新后配置与HasNavigationPropertiesLink的链接

时间:2013-07-23 15:32:36

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

我有一个基本的POCO(无数据库)结构,它使用最新的WebAPI更新实现OData服务。不幸的是,最新的更新打破了HasNavigationPropertiesLink代码,我必须生成可用于$ expand操作的链接。这是我的旧代码:

var jobs = modelBuilder.EntitySet<Job>("Jobs");
jobs.EntityType.NavigationProperties,
            (entityContext, navigationProperty) => new 
             Uri(entityContext.UrlHelper.Link(ODataRouteNames.PropertyNavigation, 
                   new 
                      { 
                           Controller = "Jobs", 
                           parentId = entityContext.EntityInstance.ID,
                           NavigationProperty = navigationProperty.Name 
                       })));

这是我的新代码(不起作用):

var jobs = modelBuilder.EntitySet<Job>("Jobs");
jobs.EntityType.NavigationProperties,
            (entityContext, navigationProperty) => new 
             Uri(entityContext.Url.Link(<??WHAT GOES HERE??>, 
                   new 
                      { 
                           Controller = "Jobs", 
                           parentId = entityContext.EdmObject,
                           NavigationProperty = navigationProperty.Name 
                       })),
                       true);

非常感谢任何帮助 - 这些似乎没有记录在更新中。

2 个答案:

答案 0 :(得分:0)

看起来你正在使用的OData位的版本非常旧。在我们当前的版本中,您可以使用ODataConventionsModelBuilder创建一个定义导航属性和遵循约定的链接的模型,因此除非您需要生成自定义链接,否则这是一个更好的方法。但是,如果要生成自定义导航链接,则链接生成代码与此类似:

        var jobs = builder.EntitySet<Job>("Jobs");
        jobs.HasNavigationPropertiesLink(customers.EntityType.NavigationProperties,
            (context, navigationProperty) =>
            {
                var result = "http://mydomain.com/prefix/odataPath";
                //In order to generate this link you can use context.Url.ODataLink(new EntityPathSegment("Jobs"), ...);
                return new Uri(result);
            }, followsConventions: true);

答案 1 :(得分:0)

最好像Javier所建议的那样使用ODataConventionsModelBuilder。但如果您仍想设置自己的odata模型,可以这样做:

var jobs = builder.EntitySet<Job>("Jobs");
        jobs.HasNavigationPropertiesLink(customers.EntityType.NavigationProperties,
            (context, navigationProperty) => context.GenerateNavigationPropertyLink(navigationProperty, false)
            , followsConventions: true);