Замена свойства объекта на другое свойство, которое находится на другом столе
Я знаю, что вопрос отстой, но именно поэтому я не могу найти ответ.
Таким образом, у меня есть сущность ("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, очевидно,