【发布时间】:2018-10-04 01:28:52
【问题描述】:
我有 2 节课:
public class A
{
public int Id { get; set; }
public string Name { get; set; }
public B myB { get; set; }
}
public class B
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<A> myAs { get; set; }
}
我正在使用 Postman 来测试 Api 调用。
public IEnumerable<B> GetBs()
{
return _context.Bs.Include(b => b.myAs).ToList();
}
按预期返回 B 对象及其关联的 A 对象的列表:
{
"Id": 1,
"Name": "B2",
"myAs": [
{
"Id": 1,
"Name": "A1"
},
{
"Id": 2,
"Name": "A2"
}
]
},
{
"Id": 2,
"Name": "B3",
"myAs": [
{
"Id": 3,
"Name": "A3"
},
{
"Id": 4,
"Name": "A4"
},
{
"Id": 5,
"Name": "A5"
}
]
}
然而,反过来会返回一个奇怪的层次结构:
public IEnumerable<A> GetAs()
{
return _context.As.Include(a => a.myB).ToList();
}
返回:
[
{
"Id": 1,
"Name": "A1",
"myB": {
"Id": 1,
"Name": "B2",
"myAs": [
{
"Id": 2,
"Name": "A2"
}
]
}
},
{
"Id": 2,
"Name": "A2",
"myB": {
"Id": 1,
"Name": "B2",
"myAs": [
{
"Id": 1,
"Name": "A1"
}
]
}
},
{
"Id": 3,
"Name": "A3",
"myB": {
"Id": 2,
"Name": "B3",
"myAs": [
{
"Id": 4,
"Name": "A4"
},
{
"Id": 5,
"Name": "A5"
}
]
}
}
]
GetAs 方法返回 A 对象和 B 对象以及进一步嵌套的 A 对象。
经过一番研究后我的理解(我在这里可能非常错误)是因为 A 对 B (myB) 具有导航属性,而 B 对 A 对象列表 (myAs) 具有导航属性,这会导致一些一种循环。
我的问题是
- 我的理解正确吗?这就是层次结构以这种奇怪的布局返回的原因吗?
- 我该如何解决这个问题?我可以将 ICollection 导航属性从域模型中取出,但我无法再查询 As 及其关联的 B?
注意 A 和 B 实际上不是我的域模型。我只是想让示例尽可能简单。
提前致谢。
【问题讨论】:
-
第二个 JSON 样本格式不正确。如果我将它上传到jsonlint.com 我会收到一个错误
Error: Parse error on line 12: Expecting 'EOF', got ','基本上它看起来像是一系列连接在一起的独立 JSON 文件。 -
嗨,是的,我错过了开头和结尾的方括号。它现在验证。关于层次结构布局的任何想法?我完全不知道该做什么
标签: c# json.net postman navigation-properties