基于其他属性在ctor中填充列表属性

时间:2018-03-23 16:27:09

标签: c# asp.net .net asp.net-mvc model

我的申请基本上只是一个有问题和多选答案的调查。问题有答案,但具体的答案可能导致提出一个特定的问题,否则可能根本不会被问到。例如“你喜欢巧克力吗?” (如果是,请问...)“你喜欢德国或荷兰巧克力吗?”

在Answer类中,我试图填充一个列表属性“DependentQuestions”,它意味着包含Quesiton的id号,如果选择了这个Answer,它将被询问。问题是,我总是一无所获,我不知道为什么。我通过使用您将在下面看到的注释代码填充DependentQuestions来确认Answer.id在构造函数运行时为零。

每个问题都有一个答案的集合。

问题类:

public class Question
{
    [Key]
    public int id { get; set; }

    public string question { get; set; }

    public int? DependentAnswer { get; set; }

    public virtual ICollection<Answer> answers { get; set; }

}

答案课:

public class Answer
{
    [Key]
    public int id { get; set; }

    public string answer { get; set; }

    [Required]
    public int questionId { get; set; }

    public List<int> DependentQuestions { get; set; }

    public Answer()
    {
        DependentQuestions = new List<int>();
        using (dbSurvey db = new dbSurvey())
        {
            var _list = db.Questions.Where(q => q.DependentAnswer == id).Select(q => q.id).ToList();
            if (_list.Any())
            {
                DependentQuestions.AddRange(_list);
            }
            //else
            //{
            //    DependentQuestions.Add(id);
            //}
        }
    }
}

问题类的“答案”集合正在填写给定问题的答案,并且工作得很好,但答案类中的DependentQuestions列表总是空的,因为Answer.id始终为零点。那么为什么Answer.id总是0,我该怎么办呢?

1 个答案:

答案 0 :(得分:1)

构造函数代码在设置任何属性值之前运行,因此在执行构造函数时,所有属性都只包含其默认值。这就是它始终为0的原因。

我不确定您使用什么作为数据访问框架,但通常您可以做一些事情:

  1. 使用id创建Answer实体,因此您始终在构造函数中使用它:

    public Answer(int id)
    
  2. 如果这不是一个选项,你也可以根据需要加载一个懒惰的属性:

    class Answer
    {
        private List<int> _dependentQuestions;
        public List<int> DependentQuestions
        {
            get
            {
                if (_dependentQuestions == null)
                    // load questions here
    
                return _dependentQuestions;
            }
        }
    }
    

    请注意,这假设已经设置了id,您可能也应该验证它。