且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

在获取和QUOT相关实体ASP.NET的WebAPI的OData v4的结果;没有HTTP资源发现,请求URI&QUOT匹配;

更新时间:2021-11-23 21:38:36

正如我在这个问题提了,我尝试了许多解决方案,以得到这个工作,但没有在实际上解决问题是一致的,我一直避免奠定了解决方案出this SO问题/答案因为教程是专门为V4和我想通这个问题的答案必须是一个旧版本(如何不明智的)。

As I mention in the question, I tried many solutions to get this to work, but none were consistent in actually solving the problem and I kept avoiding the solution laid out in this SO question/answer because the tutorial is specifically for v4 and I figured that answer must be for an older version (how unwise).

这样的回答也解决不了问题,但需要一些工作直接插入的OData v4和一个ODataConventionModelBuilder;这就是为什么我张贴了这个问题和答案;提供了解决方案,专门针对的OData v4和ODataConventionModelBuilder,希望别人不会失去我已经寻找到这个时间。

So that answer does solve the problem, but requires some work to fit directly into OData v4 and an ODataConventionModelBuilder; this is why I have posted this question and answer; to provide a solution, specifically for OData v4 and ODataConventionModelBuilder, in the hope that others won't lose the time I have looking into this.

首先,设置您的EdmModel:

First, set up your EdmModel:

private static IEdmModel GetEdmModel()
{
    var builder = new ODataConventionModelBuilder();
    builder.EnableLowerCamelCase();
    builder.EntitySet<Menu>("Menus");
    builder.EntitySet<MenuPermission>("MenuPermissions");
    var edmModel = builder.GetEdmModel();
    AddNavigations(edmModel); //see below for this method
    return edmModel;
}

二AddNavigations:

Second AddNavigations:

private static void AddNavigations(IEdmModel edmModel)
{
    AddMenuPermissionsNavigation(edmModel);
}

private static void AddMenuPermissionsNavigation(IEdmModel edmModel)
{
    var menus = (EdmEntitySet) edmModel.EntityContainer.FindEntitySet("Menus");
    var menuPermissions = (EdmEntitySet)edmModel.EntityContainer.FindEntitySet("MenuPermissions");
    var menuType = (EdmEntityType) edmModel.FindDeclaredType("iiid8.cms.data.models.Menu"); //"iiid8.cms.data.models" is the C# namespace
    var menuPermissionType = (EdmEntityType)edmModel.FindDeclaredType("iiid8.cms.data.models.MenuPermission"); //as above, "iiid8.cms.data.models" is the C# namespace
    AddOneToManyNavigation("MenuPermissions", menus, menuPermissions, menuType, menuPermissionType);
    AddManyToOneNavigation("Menu", menus, menuPermissions, menuType, menuPermissionType);
}

private static void AddOneToManyNavigation(string navTargetName, EdmEntitySet oneEntitySet, EdmEntitySet manyEntitySet,
    EdmEntityType oneEntityType, EdmEntityType manyEntityType)
{
    var navPropertyInfo = new EdmNavigationPropertyInfo
    {
        TargetMultiplicity = EdmMultiplicity.Many,
        Target = manyEntityType,
        ContainsTarget = false,
        OnDelete = EdmOnDeleteAction.None,
        Name = navTargetName
    };
    oneEntitySet.AddNavigationTarget(oneEntityType.AddUnidirectionalNavigation(navPropertyInfo), manyEntitySet);
}

private static void AddManyToOneNavigation(string navTargetName, EdmEntitySet oneEntitySet, EdmEntitySet manyEntitySet,
    EdmEntityType oneEntityType, EdmEntityType manyEntityType) {
    var navPropertyInfo = new EdmNavigationPropertyInfo {
        TargetMultiplicity = EdmMultiplicity.One,
        Target = oneEntityType,
        ContainsTarget = false,
        OnDelete = EdmOnDeleteAction.None,
        Name = navTargetName
    };
    manyEntitySet.AddNavigationTarget(manyEntityType.AddUnidirectionalNavigation(navPropertyInfo), oneEntitySet);
}

最后,从WebApiConfig.Register调用GetEdmModel

Finally, call GetEdmModel from WebApiConfig.Register

config.MapODataServiceRoute("odata", null, GetEdmModel());

现在打电话给你的OData服务的一到多,许多到一导航从客户端,所有要善于用你的世界。在我的情况下调用看​​起来是这样的:

Now call your OData service's one-to-many and many-to-one navigations from your client and all should be good with your world. In my case the calls look like this:

一到多:

http://localhost:19215/Menus(c94f7f98-6987-e411-8119-984be10349a2)/MenuPermissions

多对一酮:

http://localhost:19215/MenuPermissions(ba0da52a-6c87-e411-8119-984be10349a2)/Menu

这答案假设你建立你的项目的其余部分,就像迈克·沃森建议在问题链接(该链接为3部分教程 - 你将需要遵循第1部分第!)。

This answer assumes you set up the rest of your project just like Mike Wasson suggests in the tutorial linked in the question (that link is to Part 3 - you will need to follow Part 1 first!).