将共享POCO映射到具有多个名称的oData控制器

时间:2016-03-18 23:09:19

标签: c#-4.0 asp.net-web-api odata asp.net-web-api2 simple.odata

我有一个名为LoggerEntriesController的ODataController,它返回POCO类型WebModels.LoggerEntry。 POCO位于客户端和服务器之间共享的外部库中。

我像这样注册EntitySet

var builder = new ODataConventionModelBuilder();
builder.EntitySet<WebModels.LoggerEntry>("LoggerEntries");
config.MapODataServiceRoute("odata", "api", builder.GetEdmModel());

在我的/api元数据中,我看到:

{
  "@odata.context":"http://localhost:3177/api/$metadata","value":[
    {
      "name":"LoggerEntries","kind":"EntitySet","url":"LoggerEntries"
    },{
      "name":"LoggerEntry","kind":"EntitySet","url":"LoggerEntry"
    }
  ]
}

这会导致Simple.Odata.Client无法将LoggerEntry解析为/ api / LoggerEntries网址的问题,并且在进行强类型调用时会得到404:

await this.Client
    .For<LoggerEntry>()
    .Set(new LoggerEntry()
    {
        Title = title,
        Message = message,
    })
    .InsertEntryAsync();

这让我相信/api元数据应该像:

{
  "@odata.context":"http://localhost:3177/api/$metadata","value":[
    {
      "name":"LoggerEntry","kind":"EntitySet","url":"LoggerEntries"
    }
  ]
}

我不确定我做错了什么,或者我需要做些什么来从ODataConventionModelBuilder获取后一个元数据结果。

1 个答案:

答案 0 :(得分:1)

我认为问题在于你在服务元数据中同时拥有LoggerEntries和LoggerEntry实体集,并且Simple.OData.Client选择第一个满足其规则的实体集(反映库名非常简单 - 它接受任何东西)以复数或单数形式匹配名称。)

S.O.D的第5版将对命名约定有更严格的控制,但即使使用这个版本,我相信你应该能够通过明确指定实体集名称解决问题,即

await this.Client
    .For<LoggerEntry>("LoggerEntries")
    .Set(new LoggerEntry()
    {
        Title = title,
        Message = message,
    })
    .InsertEntryAsync();