我有一个使用ASP.NET的Web API,我试图返回一些数据,但是由于它引用的是我不想被引用的对象,因此会引起问题。
在这种情况下,类结构如下:
实体(实体),装备(团队)和电子竞技(体育)
一个实体有很多团队,而一个团队只有一个 Sport 。
我正在使用实体框架,并且对象具有两种关系; 运动具有许多团队,而团队具有一个实体。
这是我要获取具有其团队的实体以及每个团队及其运动的查询。
entitats _entitat = (
from e in db.entitats
.Include("equips.esports")
where e.id == id
select e
).FirstOrDefault();
这应该正是我想要的,问题是在第一个团队中,当向我展示运动时,运动包含所有具有相同运动的其他团队(来自该实体),然后是时间将它们显示在Team数组上,它使用$ ref和$ id。
"$id": "1",
"equips": [
{
"$id": "2",
"activitats_concedides": [],
"activitats_demanades": [],
"categories": null,
"categories_competicio": null,
"competicions": null,
"entitats": {
"$ref": "1"
},
"esports": {
"$id": "3",
// These shouldn't even be here
"equips": [
{
"$ref": "2"
},
{
"$id": "4",
"activitats_concedides": [],
"activitats_demanades": [],
"categories": null,
"categories_competicio": null,
"competicions": null,
"entitats": {
"$ref": "1"
},
"esports": {
"$ref": "3"
},
"sexes": null,
"id": 8,
"nom": "Test 2",
"id_entitat": 1,
"id_categoria": 3,
"id_esport": 1,
"id_competicio": 2,
"id_categoria_competicio": null,
"id_sexe": 3,
"borrat": false
},
{
"$id": "5",
"activitats_concedides": [],
"activitats_demanades": [],
"categories": null,
"categories_competicio": null,
"competicions": null,
"entitats": {
"$ref": "1"
},
"esports": {
"$ref": "3"
},
"sexes": null,
"id": 9,
"nom": "Test 3",
"id_entitat": 1,
"id_categoria": 2,
"id_esport": 1,
"id_competicio": 2,
"id_categoria_competicio": null,
"id_sexe": 2,
"borrat": false
},
{
"$id": "6",
"activitats_concedides": [],
"activitats_demanades": [],
"categories": null,
"categories_competicio": null,
"competicions": null,
"entitats": {
"$ref": "1"
},
"esports": {
"$ref": "3"
},
"sexes": null,
"id": 10,
"nom": "prova",
"id_entitat": 1,
"id_categoria": 3,
"id_esport": 1,
"id_competicio": 2,
"id_categoria_competicio": null,
"id_sexe": 2,
"borrat": false
}
],
"id": 1,
"nom": "Futbol"
},
"sexes": null,
"id": 3,
"nom": "Test 1",
"id_entitat": 1,
"id_categoria": 6,
"id_esport": 1,
"id_competicio": 1,
"id_categoria_competicio": null,
"id_sexe": 1,
"borrat": false
},
{
"$ref": "4" // These should be the "full" objects
},
{
"$ref": "5"
},
{
"$ref": "6"
}
],
"telefons": [],
"id": 1,
"nom": "Futbol Club Sant Cugat del Valles",
"direccio": "Sample Carrer 1",
"cif": "B12345678",
"temporada": "2019 ",
"correu": "entitat1@test.com",
"facebook": null,
"instagram": null,
"twitter": null,
"password": "8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92",
"borrat": true}
我没有问每个运动队,所以我不知道为什么要向他们展示。团队实体也会发生同样的情况,在这种情况下,这不是问题,因为它不会干扰输出,但在其他情况下,这是一个问题。我想它的作用是,如果显示的是您“询问”的对象尽可能靠近顶部,然后在实际需要它们的地方,它只是引用。
如果你们知道出了什么问题,我将非常感谢。谢谢!
PD:我尝试过更改此选项没有成功,这只会使情况变得更糟。
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
答案 0 :(得分:0)
您的问题源于对数据关系的过于宽容。 有两种解决方法:
按顺序获取数据关系。一个示例是您的Sport对象,它不需要链接到任何团队。您有团队,很棒,每个团队都有与之相关的一项运动,这就是运动的终点,只有一对一的关系,仅此而已。然后,您可以轻松地建立查询,以向您显示所有具有特定运动相关联的团队。
按原样保留结构,但是添加一些DTO以从API返回,公平的说,这是您首先应该执行的操作,无论选择哪种方法。您永远不要返回Entity Framework对象的原因之一是因为它们带有不需要的各种数据。
因此,在查询中进行选择的地方,构建一个DTO,该DTO仅包含您想要的字段,然后返回该字段即可解决问题。
select e
变为
select new EntityDTO {
assign whatever fields you need here
}
这样,您就可以断开与实体框架对象及其所有依赖关系的链接。
做一些类似的阅读工作:https://entityframework.net/knowledge-base/12568587/linq-to-sql-select-into-a-new-class