OData简单客户端:没有找到类型[type]的链接集合

本文关键字:type 集合 链接 类型 客户端 简单 OData | 更新日期: 2023-09-27 18:06:41

我有一个xamarin表单应用程序。我使用odata简单客户端来操作应用程序数据库。

我正在尝试添加数据到多对多表。

这是我第一个实体

    public class Genre : BaseGenre
    {
        List<User> Users { get; set; }
    }

和我的另一个

    public class User : BaseUser
    {
        List<Genre> Genres { get; set; }
    }

这就是我要连接它们的函数

    public async void AddGenresAsnyc(User u, List<Genre> Genres)
    {
        u.Genres = Genres;
        try {
            //await client.For<User> (CollectionName).Key(u).LinkEntryAsync(us => us.Genres, Genres);
            await client.For<User> (CollectionName).Key(u.id).Set(u).UpdateEntriesAsync();
        } catch (Exception e) {
            Exception ex = e;
        }
    }

第一个,linkentryasync抛出异常

参数个数与期望的计数不匹配。

第二个抛出

找不到类型[Genre]的链接集合

任何帮助都太好了。我被工作困住了。

OData简单客户端:没有找到类型[type]的链接集合

你需要立即改变的是制作属性类型。用户和用户。类型公开。client使用反射来分配属性值,不能为私有属性/字段分配值。我用你发给我的模式测试了你的代码,只要属性是公共的,请求就会通过。

关于下一个例子(使用LinkEntryAsync),如果你想在单个调用中更新链接,你应该使用UpdateEntryAsync,因为LinkEntryAsync为单个链接完成它。所以可以使用:

var user = await client.For<User>("ApiUser").Key(1).FindEntryAsync();
user.Genres = genres;
await client.For<User>("ApiUser").Key(user).Set(user).UpdateEntryAsync();

foreach (var genre in genres)
{
    await client.For<User>("ApiUser").Key(user).LinkEntryAsync(genre);
}

第一个操作可以用更有效的方式写:

await client.For<User>("ApiUser").Key(1).Set(new {Genres = genres}).UpdateEntryAsync();

这将生成HTTP PATCH而不是只有类型更新的PUT,但是看起来你的OData服务需要在被更新的实体上发送所有强制属性,所以这不起作用。

最后但并非最不重要的是:获得最新版本(4.9.1)的Simple.OData.Client。它有一个对您的场景很重要的修复。

更新。我测试了你的OData服务,它似乎没有适当的支持寻址链接。例如,如果我测试样例OData服务,我可以执行类似http://services.odata.org/V4/OData/%28S%28ygi3rwu514y0a4ooybn3d1gc%29%29/OData.svc/Products%284002%29/Categories/$ref的请求(注意$ref段地址categories链接,所以这个URI可以用来发布链接更新)。但是如果我执行请求http://{your_service_uri}/ApiUsers%281%29/Genres/$ref,那么我得到一个错误"没有找到与请求URI 'http://partymag.azurewebsites.net/ApiUsers(1)/Genres/$ref'匹配的HTTP资源"。只要这个链接不能在服务器端工作,你就不能使用LinkEntryAsync或UnlinkEntryAsync,但你仍然可以使用UpdateEntryAsync,正如我上面所示。

更新2。使用UpdateEntryAsync的版本执行良好,但服务不更新链接,这是Fiddler的结果:

生成的URI: PATCH http://{your_service_uri}/ApiUsers(1)贴片负载:

{  "@odata.type":"#PMWeb.Models.Models.User",
"id":1,"Name":"Ege",
"LastName":"Aydin",
"Email":"{removed}",
"Password":"{removed}",
"Genres@odata.bind":[
    "http://{your_service_uri}/Genre(31)","http://{your_service_uri}/Genre(32)"
  ]
}

反应:

{
  "@odata.context":"http://{your_service_uri}/$metadata#ApiUsers/$entity",
"id":1,
"Name":"Ege",
"LastName":"Aydin",
"Email":"{removed}",
"Password":"{removed}"
}

如果我现在检查User的类型的内容,它们是相同的。由于生成的有效负载是正确的,并且服务接受了它,因此它一定是服务器上没有正确执行的内容。