我有一个Xamarin.Forms Visual Studio解决方案,我在其中使用NuGet安装了“Simple.OData.Client”包。我有一个OData服务的URI,我想加载表“Persons”中的项目,其中基本元素类型是“Person”,其中包含类“Customer”的实例,该类继承自“Person”类,正如我在打开附加“/ $ metadata”的URI时所看到的那样。
<Schema xmlns="http://schemas.microsoft.com/ado/2009/11/edm" Namespace="A">
...
<EntityType Name="Person" Abstract="true">
...
<EntityType Name="Customer" BaseType="A.Person">
...
<EntityContainer Name="Model" m:IsDefaultEntityContainer="true">
...
<EntitySet Name="Persons" EntityType="A.Person"/>
...
我创建了一个服务实例:
ODataClient clientSimple = new ODataClient("http://.../.../odata.v3/default");
我从数据表加载项目:
System.Collections.Generic.IEnumerable<System.Collections.Generic.IDictionary<string, object>> persons = await clientSimple.For("Persons").FindEntriesAsync();
项目以字典形式返回,其中键是属性名称,值是属性值。我看到“Person”实体类型的属性以及派生的“Customer”类型中添加的属性都存在。
我知道键入语法也有可能:
var personsTyped = await clientSimple.For<Person>().FindEntriesAsync();
但是,我不知道从哪里获取“Person”类的定义,以便我可以在这里使用它作为泛型类型参数。
然后我想修改OData服务中的条目:
await clientSimple.For("Persons").Key(1).Set(new { FirstName = "Johnny" }).UpdateEntryAsync();
只要我只更新“Person”实体类型中定义的属性,但是尝试修改“Customer”实体类型中添加的属性会引发异常,这是有效的:
await clientSimple.For("Persons").Key(1).Set(new { FirstName = "Johnny", SalesPerson = "..." }).UpdateEntryAsync();
[Simple.OData.Client.UnresolvableObjectException] No property or association found for [SalesPerson].
尝试插入新项目也会失败:
var newObjectCreated = await clientSimple.For("Persons").Set(new { FirstName = "...", ... }).InsertEntryAsync();
[Simple.OData.Client.WebRequestException] Internal Server Error
如何解决这个问题,以便我可以更新所有属性并插入新项目?
答案 0 :(得分:0)
有几种信息来源可能对您有用。首先,我建议您查看Simple.OData.Client维基页面,特别是提供如何修改数据示例的页面:
https://github.com/object/Simple.OData.Client/wiki/Modifying-data
然后你可以从项目测试中获得大量的例子,例如:
如果你想使用类型语法(我推荐),你应该自己定义你的实体类型,目前Simple.OData.Client没有任何实体类型生成实用程序。