Не знаю, как настроить веб-API, проблема с получением данных - PullRequest
0 голосов
/ 19 ноября 2018

У меня была эта проблема несколько дней назад, и я подумал, что нашел решение, которое устанавливает ленивую загрузку: false.но моя проблема с получением данных сохранилась.Используя fiddler или интерфейсное приложение, я не могу получить данные, и в результате у меня есть только такие значения, как: $ ref = 6 Я думаю, что это какая-то проблема общих настроек, поэтому я собираюсь дать некоторую информациюВот.

контроллер:

    [AllowAnonymous]
    [HttpGet]
    [Route("GetQuestionsByTestId/{id}")]
    public ICollection<Question> GetQuestionsByTestId(int id)
    {
        return db.Questions.Where(t => t.TestId == id)
            .Include(a => a.Answers)
            .Include(q=>q.Test)
            .Include(q=>q.Test.TestType)
            .ToList();
    }

identityModels:

   public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
        this.Configuration.LazyLoadingEnabled = false; //false for Lazy Loading Off
        this.Configuration.ProxyCreationEnabled = false;
    }

WebApiConfig:

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

Модель вопроса:

    [Table("Question")]
    public class Question
     {
    public Question()
    {
        Answers = new HashSet<Answer>();
    }
    [Key]
    public int QuestionId { get; set; }
    [Required]
    public string Name { get; set; }
    public string Comment { get; set; }

    public int Difficulty { get; set; } 
    public byte Repeat { get; set; } // 0 - 255
    public bool IsLearned { get; set; }
    public string QuestionNumber { get; set; }

    public virtual ICollection<Answer> Answers { get; set; }


    [ForeignKey("Chapter")]
    public int ChapterId { get; set; }
    public Chapter Chapter { get; set; }


    [ForeignKey("Test")]
    public int TestId { get; set; }
    public Test Test { get; set; }

}

мой возврат получен с помощью chrome NETWORK: вот где моя проблема:

     [{$id: "1", QuestionId: 5, Name: "11", Comment: null, Difficulty: 0, Repeat: 0, 
     IsLearned: false,…},…]
     0: {$id: "1", QuestionId: 5, Name: "11", Comment: null, Difficulty: 0, Repeat: 0, 
     IsLearned: false,…}
     1: {$ref: "6"}

второй объект не виден, есть только это: $ ref: "6"

Пожалуйста, помогите,потерять надежду здесь.

1 Ответ

0 голосов
/ 20 ноября 2018

Я предполагаю, что вы используете Entity Framework для хранения и извлечения данных. Реально вы не хотите возвращать данные / сущности прямо из вашей базы данных, вы, вероятно, хотите отобразить ваши данные в набор классов, называемых Объекты передачи данных (DTO).

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

Вручную вы бы сделали что-то вроде этого

Создать класс DTO:

public class QuestionDTO
{
    public int QuestionId { get; set; }
    public string Name { get; set; }
    public string Comment { get; set; }

    public int Difficulty { get; set; }
    public byte Repeat { get; set; } // 0 - 255
    public bool IsLearned { get; set; }
    public string QuestionNumber { get; set; }
}

Изменить метод контроллера:

[AllowAnonymous]
[HttpGet]
[Route("GetQuestionsByTestId/{id}")]
public IHttpActionResult GetQuestionsByTestId(int id)
{
    var questions = db.Questions.Where(t => t.TestId == id)
        .Include(a => a.Answers)
        .Include(q => q.Test)
        .Include(q => q.Test.TestType)
        .ToList();

    var questionDTOs = new List<QuestionDTO>();

    foreach (var question in questions)
    {
        questionDTOs.Add(new QuestionDTO
        {
            QuestionId = question.QuestionId,
            Name = question.Name,
            Comment = question.Comment,
            Difficulty = question.Difficulty,
            Repeat = question.Repeat,
            IsLearned = question.IsLearned,
            QuestionNumber = question.QuestionNumber
        });
    }

    return Ok(questionDTOs);
}

(Я изменил тип возвращаемого значения, чтобы вы могли использовать метод Ok, который будет возвращать сообщение 200 или, если необходимо, возвращать другие коды состояния, например 400, с помощью BadRequest () и т. Д.)

Использование DTO позволяет вам точно контролировать, какие данные возвращаются, и вам не нужно беспокоиться о таких изменениях, как отложенная загрузка или создание прокси

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