我陷入了 .NET Framework 4.5 和较旧的 OData(当前为 7.8.2)版本。
我有一些具有“典型”OData 控制器的实体,工作正常,因为
IQueryable
返回一些 AR / AP 期刊实体。
我需要处理一些后端逻辑,然后返回相同的实体/POCO。 所以我创建了一个“自定义函数”来返回它们和一些附加数据。
由于 POCO 包含
[KEY]
,它们是实体,不再被认为是复杂的,并且获得导航属性,并且不会从控制器序列化。
所以类/地图
public class OSA_Journals
{
public String CompanyName { get; set; }
public String CompanyAddress { get; set; }
public String CurrencySymbol { get; set; }
public IEnumerable<GLTotal> GLTotals { get; set; } //NEW POCO
public IEnumerable<ArJrnl> ArDetails { get; set; } //POCO but also in EDM with KEY for EF
public IEnumerable<ApJrnl> ApDetails { get; set; } //POCO but also in EDM with KEY for EF
}
<ComplexType Name="OSA_Journals">
<Property Name="CompanyName" Type="Edm.String"/>
<Property Name="CompanyAddress" Type="Edm.String"/>
<Property Name="CurrencySymbol" Type="Edm.String"/>
<Property Name="GLTotals" Type="Collection(OSA.Data.Models.GLTotal)"/>
<NavigationProperty Name="ArDetails" Type="Collection(OSA.Data.Models.ArJrnl)"/>
<NavigationProperty Name="ApDetails" Type="Collection(OSA.Data.Models.ApJrnl)"/>
</ComplexType>
自定义函数构建所有列表(GL、AP 和 AR),并在自定义函数结束时返回完整的
OSA_Journals
类。
问题是,只有“复杂”(即
GLTotals
)才会序列化! ArDetails
和 ApDetails
都不会序列化,因为它们被视为“NavigationProperty”。
如果我从 Ar/ApDetails 中删除
[KEY]
,那么它们就不再是“实体”,并且地图从“NavigationProperty”更改为“Property”,并且数据将序列化。
问题是我原来的
IQueryable
Ar/ApDetails 控制器现在不起作用,因为不再是“实体”,因为没有 [KEY]
:( )
我看不出有什么办法
$Expand
自定义函数...
我认为没有办法在自定义函数中共享将“实体”视为复杂的 POCO
我看不出有什么办法可以序列化函数结果......(在
HasDynamicProperties
中损失了几个小时)
我无法继承 POCO,因为它们都需要是基础...
我真的必须复制所有“实体”POCO 才能使它们变得“复杂”吗?
“NavigationProperty”不应应用于自定义函数!
我不能孤单,真的没有看到任何好的例子或任何人有类似的问题,这是令人震惊的!
提前非常感谢!
亲切的问候, 迈克
builder.ComplexType<ArJrnl>()
显式地将 AP 和 AR 构建为复杂类型,然后它会抑制“key”约定并避免将它们构建为实体类型。