将共享 POCO 映射到具有复数名称的 oData 控制器
mapping shared POCO to oData controllers with plural names
我有一个名为 LoggerEntriesController
的 ODataController returns WebModels.LoggerEntry
的 POCO 类型。 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 url 的问题,并且在进行强类型调用时会收到 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 获取后一个元数据结果。
我认为问题在于您的服务元数据中同时包含 LoggerEntries 和 LoggerEntry 实体集,并且 Simple.OData.Client 选择第一个满足其规则的实体(这非常简单地反映了库名称 - 它接受任何与名称匹配的复数或单数形式)。
S.O.D 的第 5 版将对命名约定有更严格的控制,但即使使用这个版本,我相信您也应该能够通过明确指定实体集名称来解决这个问题,即
await this.Client
.For<LoggerEntry>("LoggerEntries")
.Set(new LoggerEntry()
{
Title = title,
Message = message,
})
.InsertEntryAsync();
我有一个名为 LoggerEntriesController
的 ODataController returns WebModels.LoggerEntry
的 POCO 类型。 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 url 的问题,并且在进行强类型调用时会收到 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 获取后一个元数据结果。
我认为问题在于您的服务元数据中同时包含 LoggerEntries 和 LoggerEntry 实体集,并且 Simple.OData.Client 选择第一个满足其规则的实体(这非常简单地反映了库名称 - 它接受任何与名称匹配的复数或单数形式)。
S.O.D 的第 5 版将对命名约定有更严格的控制,但即使使用这个版本,我相信您也应该能够通过明确指定实体集名称来解决这个问题,即
await this.Client
.For<LoggerEntry>("LoggerEntries")
.Set(new LoggerEntry()
{
Title = title,
Message = message,
})
.InsertEntryAsync();