更新和插入OData服务

时间:2015-09-24 12:26:01

标签: properties insert odata

我有一个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

如何解决这个问题,以便我可以更新所有属性并插入新项目?

1 个答案:

答案 0 :(得分:0)

有几种信息来源可能对您有用。首先,我建议您查看Simple.OData.Client维基页面,特别是提供如何修改数据示例的页面:

https://github.com/object/Simple.OData.Client/wiki/Modifying-data

然后你可以从项目测试中获得大量的例子,例如:

https://github.com/object/Simple.OData.Client/blob/master/Simple.OData.Client.Tests.Net40/InsertTests.cs

https://github.com/object/Simple.OData.Client/blob/master/Simple.OData.Client.Tests.Net40/InsertTypedTests.cs

https://github.com/object/Simple.OData.Client/blob/master/Simple.OData.Client.Tests.Net40/UpdateTests.cs

https://github.com/object/Simple.OData.Client/blob/master/Simple.OData.Client.Tests.Net40/UpdateTypedTests.cs

如果你想使用类型语法(我推荐),你应该自己定义你的实体类型,目前Simple.OData.Client没有任何实体类型生成实用程序。