ASP.NET Web API показывает объекты в формате JSON, которые я не просил - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть веб-API с ASP.NET, и я пытаюсь вернуть некоторые данные, но это вызывает проблемы, так как ссылается на объекты, на которые я не хочу ссылаться.

Структура класса вэтот случай выглядит следующим образом:

Entitats (Entities), Equips (Team) и Esports (Sports)

У Entity есть много Команд , а у одной Team есть только один Sport .

. Я использую Entity Framework иОбъекты имеют отношения в обе стороны; Sport имеет много команд , а Team имеет Entity .

Вот запрос, который я делаю дляполучить сущность со своей командой и каждую команду со своим видом спорта.

 entitats _entitat = (
                   from e in db.entitats
                       .Include("equips.esports")
                   where e.id == id
                   select e
               ).FirstOrDefault();

Это должно дать мне именно то, что я хочу, проблема в том, что в первой команде, когда она показывает мне спорт, спортсодержит все другие команды (из этой сущности), которые имеют тот же вид спорта, а затем, когда пришло время показать их в массиве команд, он использует $ 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;

1 Ответ

0 голосов
/ 05 апреля 2019

Ваша проблема в том, что вы слишком либеральны с вашими отношениями с данными.Есть два способа решить эту проблему:

  1. приведите ваши отношения данных в порядок.Примером является ваш спортивный объект, он не должен ссылаться на какие-либо команды.У вас есть команды, отлично, у каждой команды есть связанный спорт, это то, где она заканчивается, есть отношения один на один и больше ничего.Затем вы можете легко создать запрос, чтобы показать вам все команды, с которыми связан определенный вид спорта.

  2. Сохраните вашу структуру такой, какая она есть, но добавьте несколько DTO для возврата из вашего API,чтобы быть честным, это то, что вы должны делать в первую очередь, какой бы вариант вы ни выбрали.Одна из причин, по которой вы никогда не должны возвращать объекты Entity Framework, состоит в том, что они содержат все виды данных, которые вам не нужны.

Итак, в вашем запросе, где вы делаете свой выбор, создайте 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...