Ядро Asp.net, как загрузить связанные данные в Viewmodel Entity Framework - PullRequest
1 голос
/ 19 июня 2019

Я работаю над проектом Asp.net core 2.2 и у меня проблема с загрузкой связанных данных во ViewModel.

Прежде всего, у меня есть таблица с именем QuestionTbl:

public class Question
{
    [Key]
    public int questionID { get; set; }
    public string questionTitle { get; set; }
    public string GroupID { get; set; }
}

Как вы видите, у меня есть string свойство с именем GroupID в Question таблице, в которой отображаются группы каждого вопроса.

Например

1 row in questionTbl
---------
questionID = 1
questionTitle = 'What is Your Name ?'
GroupID = '3,4,5'

В приведенном выше примере вопрос с ID = 1 состоит из 3 групп (3 and 4 and 5).

А GroupTbl:

public class Group
{
    [Key]
    public int GroupID { get; set; }
    public string GroupName { get; set; }
}

Теперь я хочу показать список вопросов со связанными группами.

У меня есть ViewModel, как это:

public class GetQuestionViewModel
{
    public int questionID { get; set; }
    public string questionTitle { get; set; }
    public ICollection<Group> QuestionGroups { get; set; }
}

И запрос моей структуры сущности:

var questionQuery = (from a in _db.QuestionTbl
                             select new GetQuestionViewModel()
                             {
                                 questionID = a.questionID,
                                 questionTitle = a.questionTitle
                             })
                             .Include(q => q.QuestionGroups)
                             .ToList();

Я хочу, чтобы список содержал вопросы и группы по каждому вопросу. Но QuestionGroups возвращает ноль в моем запросе. Я также прочитал эту ссылку, но она мне не помогла.

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Вы не можете использовать Include здесь для ViewModel напрямую. Советую использовать отношение «многие ко многим» для моделей вопросов и групп.

Модель:

public class Question
{
    [Key]
    public int questionID { get; set; }
    public string questionTitle { get; set; }

    public List<QuestionGroup> QuestionGroups { get; set; }
    //public List<Group> Groups { get; set; }
    //public string GroupID { get; set; }
}
public class Group
{
    [Key]
    public int GroupID { get; set; }
    public string GroupName { get; set; }

    public List<QuestionGroup> QuestionGroups { get; set; }
}

public class QuestionGroup
{
    public int QuestionId { get; set; }
    public Question Question { get; set; }

    public int GroupId { get; set; }
    public Group Group { get; set; }
}

public class GetQuestionViewModel
{
    public int questionID { get; set; }
    public string questionTitle { get; set; }
    public ICollection<Group> QuestionGroups { get; set; }
}

DbContext;

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<QuestionGroup>()
       .HasKey(t => new { t.QuestionId, t.GroupId });

        modelBuilder.Entity<QuestionGroup>()
            .HasOne(qg => qg.Question)
            .WithMany(q => q.QuestionGroups)
            .HasForeignKey(qg => qg.QuestionId);

        modelBuilder.Entity<QuestionGroup>()
            .HasOne(qg=>qg.Group)
            .WithMany(g => g.QuestionGroups)
            .HasForeignKey(qg => qg.GroupId);
   }

Основной запрос EF;

var questionQuery = (from a in _context.QuestionTbl.Include(q => q.QuestionGroups)
                             select new GetQuestionViewModel()
                             {
                                 questionID = a.questionID,
                                 questionTitle = a.questionTitle,
                                 QuestionGroups = a.QuestionGroups.Select(qg => qg.Group).ToList()

                             })
                         .ToList();
0 голосов
/ 19 июня 2019

Нормализуйте свои таблицы, следуя Документам Microsoft :

Вопрос :

public class Question
{
    [Key]
    public int questionID { get; set; }
    public string questionTitle { get; set; }

    public int GroupID { get; set; }
    [ForeignKey("Group_ID")]
    public virtual Group Group { get; set; }
}

Группа :

public class Group
{
    [Key]
    public int GroupID { get; set; }
    public string GroupName { get; set; }

    public virtual List<Question> questions { get; set; }
}

На данный момент вы можете запросить записи следующим образом:

db.Question.Include(q => q.Group)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...