C# 基于其他属性填充ctor中的列表属性
我的应用程序基本上只是一个带有问题和多项选择答案的调查。问题有答案,但一个特定的答案可能会导致一个特定的问题被提出,否则可能根本不会被提出。e、 g.“你喜欢巧克力吗?”(如果喜欢,问…“你喜欢德国巧克力还是荷兰巧克力?” 在Answer类中,我尝试填充一个列表属性“DependentQuestions”,该属性用于包含问题的id号,如果选择了此答案,将在下一步询问该问题。问题是,我总是一无所获,我不知道为什么。在构造函数运行时,我用下面将看到的注释代码填充DependentQuestions,从而确认Answer.id为零 每个问题都有一组答案 问题类别:C# 基于其他属性填充ctor中的列表属性,c#,asp.net,.net,asp.net-mvc,model,C#,Asp.net,.net,Asp.net Mvc,Model,我的应用程序基本上只是一个带有问题和多项选择答案的调查。问题有答案,但一个特定的答案可能会导致一个特定的问题被提出,否则可能根本不会被提出。e、 g.“你喜欢巧克力吗?”(如果喜欢,问…“你喜欢德国巧克力还是荷兰巧克力?” 在Answer类中,我尝试填充一个列表属性“DependentQuestions”,该属性用于包含问题的id号,如果选择了此答案,将在下一步询问该问题。问题是,我总是一无所获,我不知道为什么。在构造函数运行时,我用下面将看到的注释代码填充DependentQuestions,
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; }
}
公开课问题
{
[关键]
公共int id{get;set;}
公共字符串问题{get;set;}
public int?DependentAnswer{get;set;}
公共虚拟ICollection答案{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);
//}
}
}
}
公共类答案
{
[关键]
公共int id{get;set;}
公共字符串答案{get;set;}
[必需]
public int questionId{get;set;}
公共列表依赖项问题{get;set;}
公众答覆(
{
DependentQuestions=新列表();
使用(dbSurvey db=new dbSurvey())
{
var _list=db.Questions.Where(q=>q.DependentAnswer==id).选择(q=>q.id).ToList();
如果(_list.Any())
{
DependentQuestions.AddRange(_列表);
}
//否则
//{
//DependentQuestions.Add(id);
//}
}
}
}
问题类的“答案”集合中填充了给定问题的答案,效果很好,但答案类中的DependentQuestions列表始终为空,因为此时Answer.id始终为零。那么为什么Answer.id总是0,我能做些什么呢?构造函数代码在设置任何属性值之前运行,因此在执行构造函数时,所有属性都只包含它们的默认值。这就是为什么它总是0 我不确定您使用什么作为数据访问框架,但通常您可以做几件事:
public Answer(int id)
class Answer
{
private List<int> _dependentQuestions;
public List<int> DependentQuestions
{
get
{
if (_dependentQuestions == null)
// load questions here
return _dependentQuestions;
}
}
}
课堂答案
{
私人名单(独立问题);;
公共列表从属问题
{
得到
{
if(_dependentQuestions==null)
//在这里加载问题
返回_dependentQuestions;
}
}
}
注意,这假设已经设置了id,您可能也应该对此进行验证Ctor代码是在设置任何属性之前运行的,那么您如何期望它是非零的呢?另外,您可以有一个lazy属性,但我不确定它在EF中有多常见(您正在使用EF,对吗?),谢谢您的回复。我对构造器代码也有同样的怀疑,但不确定,也不确定如何找到答案。创建问题实体时,将创建答案实体。我按照你的建议做了。现在我得到了“对象引用未设置…”,这对我来说意味着它工作了!我不知道为什么会出现这个错误,因为生成它的代码正是试图验证它是否存在的代码。。。我认为这可能是一篇新文章,但这是导致它的原因(在razor视图中):
@if(answer.DependentQuestions!=null){