在MVC 5数据库中使用多对多关系播种数据,代码优先

时间:2018-05-09 09:26:43

标签: asp.net-mvc

我对MVC编程很新,所以请温柔地对待我。 我正在开发一个数据库,我需要以多对多的关系为数据提供种子。我已经在这个和其他论坛上做了很多搜索,找到了各种建议,但似乎没有一个在我的设置中起作用。当我在add-migration之后执行update-database命令时,我不断收到错误("对象引用未设置为对象的实例"),无论我尝试过什么方法。我有以下模型类:

public class Cognition
{
    public int CognitionID { get; set; }
    public string CognitionText { get; set; }
    public virtual ICollection<Diagnosis> Diagnoses { get; set; }
    public virtual ICollection<SubDiagnosis> SubDiagnoses { get; set; }
}
public class Diagnosis
{
    public int DiagnosisID { get; set; }
    public string DiagnosisText { get; set; }
    public virtual ICollection<Cognition> Cognitions { get; set; }
    public virtual ICollection<SubCognition> SubCognitions { get; set; }
}

我还有两个SubCognition和SubDiagnoses(一对多关系)的模型类,为简单起见,我在这里省略了这些类。然后我有以下播种代码:

protected override void Seed(NVD.DAL.NVDContext context)
    {
        var diagnoses = new[]
        {
            new Diagnosis { DiagnosisText = "Alzheimer's disease" },
            new Diagnosis { DiagnosisText = "Mixed dementia" },
            new Diagnosis { DiagnosisText = "Cerebrovascular disease" },
            new Diagnosis { DiagnosisText = "Lewy body dementia" },
            new Diagnosis { DiagnosisText = "Parkinson's disease (PD)" },
            new Diagnosis { DiagnosisText = "Parkinson Plus (PSP/CBD/MSA)" },
            new Diagnosis { DiagnosisText = "Huntington's disease" },
            new Diagnosis { DiagnosisText = "Frontotemporal dementia" },
            new Diagnosis { DiagnosisText = "Normal pressure Hydrocephalus (NPH)" },
            new Diagnosis { DiagnosisText = "Other neurodegenerative disorder" },
            new Diagnosis { DiagnosisText = "Alcohol" },
            new Diagnosis { DiagnosisText = "Other non-neurodegenerative disorder" },
            new Diagnosis { DiagnosisText = "Unknown" },
            new Diagnosis { DiagnosisText = "SCD" },
            new Diagnosis { DiagnosisText = "Psychiatric illness" },
            new Diagnosis { DiagnosisText = "NPH" },
            new Diagnosis { DiagnosisText = "Other" }          
        };

        context.Diagnoses.AddOrUpdate(r => r.DiagnosisText, diagnoses[0], diagnoses[1], diagnoses[2], diagnoses[3], diagnoses[4], diagnoses[5], diagnoses[6], diagnoses[7], diagnoses[8], diagnoses[9],
            diagnoses[10], diagnoses[11], diagnoses[12], diagnoses[13], diagnoses[14], diagnoses[15], diagnoses[16]);

        var cognitions = new[]
        {
            new Cognition { CognitionText = "Normal" },
            new Cognition { CognitionText = "Significantly impaired" },
            new Cognition { CognitionText = "Mild dementia" },
            new Cognition { CognitionText = "Moderate dementia" },
            new Cognition { CognitionText = "Severe dementia" }
        };
        context.Cognitions.AddOrUpdate(r => r.CognitionText, cognitions[0], cognitions[1], cognitions[2], cognitions[3], cognitions[4]);
        context.SaveChanges();

        cognitions[0].Diagnoses.Add(diagnoses[14]);
        context.SaveChanges();
    }

我知道认知[0]和诊断[14]不是空的,因为我在种子代码的其他地方使用它们来添加一些一对多关系,我知道这是最后两行代码失败,因为如果我删除那些一切都很好。有人能指出我如何使这个工作正确的方向吗?

非常感谢任何帮助!

一切顺利 特勒尔斯

1 个答案:

答案 0 :(得分:0)

我认为问题是认知[0] .Diagnoses为空。

cognitions[0].Diagnoses.Add(diagnoses[14]);之前添加以下内容:

cognitions[0].Diagnoses = new List<Diagnosis>();

顺便说一下。你添加两次诊断[14],这是没有必要的..