C# 基于其他属性填充ctor中的列表属性

C# 基于其他属性填充ctor中的列表属性,c#,asp.net,.net,asp.net-mvc,model,C#,Asp.net,.net,Asp.net Mvc,Model,我的应用程序基本上只是一个带有问题和多项选择答案的调查。问题有答案,但一个特定的答案可能会导致一个特定的问题被提出,否则可能根本不会被提出。e、 g.“你喜欢巧克力吗?”(如果喜欢,问…“你喜欢德国巧克力还是荷兰巧克力?” 在Answer类中,我尝试填充一个列表属性“DependentQuestions”,该属性用于包含问题的id号,如果选择了此答案,将在下一步询问该问题。问题是,我总是一无所获,我不知道为什么。在构造函数运行时,我用下面将看到的注释代码填充DependentQuestions,

我的应用程序基本上只是一个带有问题和多项选择答案的调查。问题有答案,但一个特定的答案可能会导致一个特定的问题被提出,否则可能根本不会被提出。e、 g.“你喜欢巧克力吗?”(如果喜欢,问…“你喜欢德国巧克力还是荷兰巧克力?”

在Answer类中,我尝试填充一个列表属性“DependentQuestions”,该属性用于包含问题的id号,如果选择了此答案,将在下一步询问该问题。问题是,我总是一无所获,我不知道为什么。在构造函数运行时,我用下面将看到的注释代码填充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; }

}
公开课问题
{
[关键]
公共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

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

  • 创建id为的应答实体,使其始终位于构造函数中:

    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){