Контроллер Web API 2 с Entity Framework 6 с включением - PullRequest
0 голосов
/ 12 февраля 2020

Я создал веб-API для подключения и обновления данных на SQL Сервере, используя Entity Framework 6 (сначала для базы данных).

Я замечаю, когда я генерирую контроллеры для своей таблицы, функция Get<XXX> возвращает только строку таблицы без включения дочерних строк.

Это можно исправить с помощью метода расширения System.Data.Entity.Include?

Однако, когда я сделал простой тест для получения строки таблицы и связанной с ней дочерние строки, я получаю ответ

StatusCode: 500, ReasonPhrase: «Внутренняя ошибка сервера»,

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

// GET: api/Fields/5
[ResponseType(typeof(Field))]
public async Task<IHttpActionResult> GetField(Guid id)
{
    Field field = await db.Fields.Include(x=>x.Layers).FirstOrDefaultAsync(i => i.FieldKey == id);

    if (field == null)
    {
        return NotFound();
    }

    return Ok(field);
}

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

Я отключил отложенную загрузку и прокси в конструкторе DbContext:

 this.Configuration.LazyLoadingEnabled = false;
 this.Configuration.ProxyCreationEnabled = false;

1 Ответ

0 голосов
/ 14 февраля 2020

Я нашел причину. Это потому, что сериализатор по умолчанию JSON не может правильно сериализовать какие-либо ссылки на циклы среди объектов

. Ответ заключается в том, чтобы поместить

 var json = config.Formatters.JsonFormatter;
        json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
        config.Formatters.Remove(config.Formatters.XmlFormatter);

в

* 1007. * publi c stati c class WebApiConfig {publi c stati c void Register (конфигурация HttpConfiguration)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...