我的申请基本上只是一个有问题和多选答案的调查。问题有答案,但具体的答案可能导致提出一个特定的问题,否则可能根本不会被问到。例如“你喜欢巧克力吗?” (如果是,请问...)“你喜欢德国或荷兰巧克力吗?”
在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,我该怎么办呢?
答案 0 :(得分:1)
构造函数代码在设置任何属性值之前运行,因此在执行构造函数时,所有属性都只包含其默认值。这就是它始终为0的原因。
我不确定您使用什么作为数据访问框架,但通常您可以做一些事情:
使用id创建Answer实体,因此您始终在构造函数中使用它:
public Answer(int id)
如果这不是一个选项,你也可以根据需要加载一个懒惰的属性:
class Answer
{
private List<int> _dependentQuestions;
public List<int> DependentQuestions
{
get
{
if (_dependentQuestions == null)
// load questions here
return _dependentQuestions;
}
}
}
请注意,这假设已经设置了id,您可能也应该验证它。