Замена свойства объекта на другое свойство, которое находится на другом столе

Я знаю, что вопрос отстой, но именно поэтому я не могу найти ответ.

Таким образом, у меня есть сущность ("TeacherEntity"), которая представляет собой таблицу базы данных. Одно из свойств представляет собой внешний ключ, который сопоставляется с другой таблицей ("StudentEntity"). В таблице ("Учитель") ученики отображаются в виде чисел.

public class TeacherEntity()
{
    public int TeacherId;
    public string Name;
}

public class StudentEntity()
{
    public int StudentId;
    public string StudenName;
    public int TeacherId;
}

У меня также есть класс ViewModel ("StudentViewModel").

public class StudentViewModel()
{
   public int Id;
   public string Name;
   public string TeacherName;
}

То, чего я пытаюсь достичь, - это когда я зачитываю список студентов с моим репозиторием.

public List<TblShisha> GetStudents()
{
    return _context.StudentEntity.OrderBy(o => o.Name).ToList();
}

Я должен упомянуть, что я использую AutoMapper в моей папке автозагрузки на случай, если это что-то изменит.

 cfg.CreateMap<Entities.StudentEntity, Models.StudentViewModel>()
     .ForMember(dest => dest.TeacherName, opt => opt.MapFrom(src => $" 
     {src.TeacherEntity.Name}"));

Я хочу иметь имя Учителя для этого ученика вместо их идентификатора. Нужно ли читать список учеников и заменять идентификаторы учителей их именами на контроллере или есть лучший способ?

2 ответа

Я бы добавил свойство типа Учитель к Студенту. Тогда в запросе вы можете сделать:

_context.StudentEntity.Include("Teacher").OrderBy(o => o.Name).ToList();

Затем вы можете заполнить вашу модель представления с помощью Student.Teacher.Name

Это можно сделать, настроив DbContext с двумя таблицами.

контекст

public class TeacherStudentContext : DbContext
{
    public virtual DbSet<Student> Student { get; set; }
    public virtual DbSet<Teacher> Teacher { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlServer(@"<connString>");
        }
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Student>(entity =>
        {
            entity.Property(e => e.Name).IsRequired();

            entity.HasOne(d => d.Teacher)
                .WithMany(p => p.Student)
                .HasForeignKey(d => d.TeacherId)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("FK_Student_Teacher");
        });

        modelBuilder.Entity<Teacher>(entity =>
        {
            entity.Property(e => e.Name).IsRequired();
        });
    }
}

учитель

public class Teacher
{
    public Teacher()
    {
        Student = new HashSet<Student>();
    }

    public int TeacherId { get; set; }
    public string Name { get; set; }

    public ICollection<Student> Student { get; set; }
}

Ученик

public class Student
{
    public int StudentId { get; set; }
    public string Name { get; set; }
    public int TeacherId { get; set; }

    public Teacher Teacher { get; set; }
}

Теперь вы можете просто использовать LINQ для навигации в любой точке без необходимости включать таблицу учителя.

var vm = _context.Student.Select(x => new StudentViewModel{
    Id = x.StudentId,
    Name = x.Name,
    TeacherName = x.Teacher.Name
});

Или вы можете использовать Automapper, очевидно,

Другие вопросы по тегам