OData 自定义函数返回带有实体的 POCO 无法序列化

问题描述 投票:0回答:1

我陷入了 .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”不应应用于自定义函数!

我不能孤单,真的没有看到任何好的例子或任何人有类似的问题,这是令人震惊的!

提前非常感谢!

亲切的问候, 迈克

entity-framework odata .net-4.5
1个回答
0
投票
  1. 您可以调用
    builder.ComplexType<ArJrnl>()
    显式地将 AP 和 AR 构建为复杂类型,然后它会抑制“key”约定并避免将它们构建为实体类型。
  2. 您可以在 C# 类上修饰 [ComplexType],让约定模型构建器将该类型视为复杂类型。
  3. 如果您仍然需要将它们保留为导航属性,那么您可以在该属性上调用装饰[AutoExpand]以使其自动扩展。
  4. 或者您可以调用类似的API来启用/配置该属性作为自动展开导航属性。
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.