如何为外键允许null以避免NullReferenceException?

问题描述

我创建了一个ASP.NET MVC Web应用程序来为我的数据库表执行CRUD操作。我遇到了错误

System.NullReferenceException

在运行程序时。

编写该代码是为了从2个表中检索记录:ReportMember。在Report表中,我有一个外键MemberID引用了代表报告创建者的Member表。

但是报告并不总是具有MemberID。因此,我将外键MemberID保留为Report表中的可空列。但是,当我运行ASP.NET MVC应用程序时,它将引发错误并在以下代码位置停止运行。这是我在TestController.Index()方法中拥有的代码

List<Reportviewmodel> repVMList = rep.Select(x => new Reportviewmodel
                                                  { 
                                                      ReportID = x.ReportID,ReportName = x.ReportName,FrequencyType = x.FrequencyType,DateAdded = x.DateAdded,MemberID = x.MemberID,Name = x.Member3.Name
                                                  }).ToList();

如果我删除MemberID表中Report列的所有为空的记录,则程序运行无任何错误

请问您如何避免该错误的建议?任何帮助将不胜感激。

public class Reportviewmodel
{
    public int ReportID { get; set; }
    public string ReportName { get; set; }
    public string FrequencyType { get; set; }
    public Nullable<int> MemberID { get; set; }
    public Nullable<System.DateTime> DateAdded { get; set; }

    public string Name { get; set; }
}

sql Server中创建表

create table dbo.Member3 
(
    MemberID int identity(100,1) primary key,Name varchar(255) null,Email varchar(255) null,Initials varchar(50) null
);

create table dbo.Report3 
(
    ReportID int identity(1,ReportName varchar(255) not null,FrequencyType varchar(100) not null,MemberID int null,DateAdded date null,constraint FK_MemberMemID foreign key (MemberID) references dbo.Member3(MemberID)
)

解决方法

您可以保留当前架构,并在lambda中检查是否为空。 x.Member3.Name应更改为x.Member3?.Namex.Member3 != null ? x.Member3.Name : null

因此您所有的代码都将如下所示

List<ReportViewModel> repVMList = rep.Select(x => new ReportViewModel
    { ReportID = x.ReportID,ReportName = x.ReportName,FrequencyType = x.FrequencyType,DateAdded = x.DateAdded,MemberID = x.MemberID,Name = x.Member3 != null ? x.Member3.Name : null 
    }).ToList();