Search code examples
c#asp.net-core-3.1ef-core-3.1

Child Table Properties are not fetching in ef core inheritance


i have following entities..

    public class Paper
    {
        public int Id { get; set; }
        public string PaperCode { get; set; }
        ...
    }
    public class MCQPaper : Paper
    {
        public ICollection<MCQQuestion> Questions { get; set; }
    }
    public class MCQQuestion : Question
    {
        public int MCQPaperId { get; set; }
        public MCQPaper MCQPaper { get; set; }

        public int? MCQOptionId { get; set; }
        [ForeignKey("MCQOptionId")]
        public MCQOption TrueAnswer { get; set; }
        public ICollection<MCQOption> MCQOptions { get; set; }
    }
    public class MCQOption
    {
        public int Id { get; set; }
        public string OptionText { get; set; }
    }

and i am trying to fetch MCQPaper based on unique papercode but it always gives me empty collection of Questions

here is my Query inside Repository..

        public MCQPaper GetByPaperCode(string paperCode)
        {
            var ans = AppDbContext.MCQPapers
                .Where(paper => paper.PaperCode.Equals(paperCode))
                //.Include(paper => paper.Questions)
                //    .ThenInclude(que => que.MCQOptions)
                .Include(paper => paper.Questions)
                    .ThenInclude(que => que.MCQPaper)
                //.Include(paper => paper.Questions)
                //    .ThenInclude(que => que.TrueAnswer)
                .FirstOrDefault();
            return ans;
        }

here i have tried various combinations of include() and theninclude() but none of them work for me

and lastly ignore grammer mistakes if any

thankyou in advance


Solution

  • after going threw comments and searching on google i have found solution

    using two queries this problem can be solved because here i have circular dependency between MCQQuestion and MCQOption

    so solution is ....

            public MCQPaper GetByPaperCode(string paperCode)
            {
                using var transaction = AppDbContext.Database.BeginTransaction();
                MCQPaper ans = new MCQPaper();
                try
                {
                    ans = AppDbContext.MCQPapers
                    .FirstOrDefault(paper => paper.PaperCode.Equals(paperCode));
                    var questions = AppDbContext.MCQQuestions
                        .Include(que => que.MCQOptions)
                        .Where(que => que.MCQPaperId == ans.Id);
                    ans.Questions = questions.ToList();
                    transaction.Commit();
                }
                catch (Exception)
                {
                    transaction.Rollback();
                }
                return ans;
            }