几天前我遇到了这个问题,并以为我找到了解决方案 设置延迟加载:false。 但是我检索数据的问题仍然存在。 使用提琴手或前端应用程序,我无法检索数据,结果,我只有类似$ 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”
请帮助,在这里失去希望。
答案 0 :(得分:0)
我在这里猜测您正在使用Entity Framework来存储和检索数据。实际上,您不想直接从数据库返回数据/实体,您可能希望将数据映射到一组名为Data Transfer Objects(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条消息,或者在需要时使用BadRequest()等返回其他状态代码,例如400)
使用DTO,您可以精确控制返回的数据,而不必担心更改诸如延迟加载或代理创建之类的东西