WebAPI Как я могу заполнить пустые результаты в формате JSON - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть такой результат:

Result

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

MyDBContext:

 public partial class MyContext : DbContext
{
    public MyContext()
        : base("name=MyContext")

    {
       this.Configuration.ProxyCreationEnabled = false;
      //this.Configuration.LazyLoadingEnabled = false;
    }

    public virtual DbSet<Announcement> Announcement { get; set; }
    public virtual DbSet<Class> Class { get; set; }
    public virtual DbSet<Discontinuity> Discontinuity { get; set; }
    public virtual DbSet<Grade> Grade { get; set; }
    public virtual DbSet<Group> Group { get; set; }
    public virtual DbSet<Lesson> Lesson { get; set; }
    public virtual DbSet<Management> Management { get; set; }
    public virtual DbSet<Payment> Payment { get; set; }
    public virtual DbSet<Questions> Questions { get; set; }
    public virtual DbSet<Student> Student { get; set; }
    public virtual DbSet<Teacher> Teacher { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Class>()
            .HasMany(e => e.Student)
            .WithOptional(e => e.Class)
            .HasForeignKey(e => e.Class_Id);

        modelBuilder.Entity<Group>()
            .HasMany(e => e.Student)
            .WithOptional(e => e.Group)
            .HasForeignKey(e => e.Group_Id);

        modelBuilder.Entity<Lesson>()
            .HasMany(e => e.Teacher)
            .WithRequired(e => e.Lesson)
            .HasForeignKey(e => e.Lesson_Id)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<Student>()
            .HasMany(e => e.Discontinuity)
            .WithOptional(e => e.Student)
            .HasForeignKey(e => e.Student_Id);

        modelBuilder.Entity<Student>()
            .HasMany(e => e.Grade)
            .WithOptional(e => e.Student)
            .HasForeignKey(e => e.Student_Id);

        modelBuilder.Entity<Student>()
            .HasMany(e => e.Payment)
            .WithOptional(e => e.Student)
            .HasForeignKey(e => e.Student_Id);
    }
}

Мой класс контроллера:

public class StudentsController : ApiController
{
    private MyContext db = new MyContext();

    // GET: api/Students
    public IQueryable<Student> GetStudent()
    {
        return db.Student;
    }

    // GET: api/Students/5
    [ResponseType(typeof(Student))]
    public IHttpActionResult GetStudent(int id)
    {
        Student student = db.Student.Find(id);
        if (student == null)
        {
            return NotFound();
        }

        return Ok(student);
    }

    // PUT: api/Students/5
    [ResponseType(typeof(void))]
    public IHttpActionResult PutStudent(int id, Student student)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        if (id != student.Id)
        {
            return BadRequest();
        }

        db.Entry(student).State = EntityState.Modified;

        try
        {
            db.SaveChanges();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!StudentExists(id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return StatusCode(HttpStatusCode.NoContent);
    }

    // POST: api/Students
    [ResponseType(typeof(Student))]
    public IHttpActionResult PostStudent(Student student)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        db.Student.Add(student);
        db.SaveChanges();

        return CreatedAtRoute("DefaultApi", new { id = student.Id }, student);
    }

    // DELETE: api/Students/5
    [ResponseType(typeof(Student))]
    public IHttpActionResult DeleteStudent(int id)
    {
        Student student = db.Student.Find(id);
        if (student == null)
        {
            return NotFound();
        }

        db.Student.Remove(student);
        db.SaveChanges();

        return Ok(student);
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            db.Dispose();
        }
        base.Dispose(disposing);
    }

    private bool StudentExists(int id)
    {
        return db.Student.Count(e => e.Id == id) > 0;
    }
}

Как я могу заполнитьмои иностранные классы?И мне интересно, есть ли способ набирать имена классов в начале результата.Например, если я учусь в Студенте, он должен начинаться с: "Студент": [{"Id": 18}] Эти классы уже заполнены в базе данных.И у меня уже есть ModelBuilder.Но я правда не знаю, где я допустил ошибку?

1 Ответ

1 голос
/ 29 апреля 2019

Вам нужно .Include эти дополнительные свойства, которые будут указывать EF идти и извлекать данные для вас.

Чтобы сделать это, вам нужно немного изменить синтаксис так:

var student = db.Student
    .Include(i => i.Discontinuity)
    .Include(i => i.Payment)
    .SingleOrDefault(s => s.Id == id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...