问题描述
我创建了一个ASP.NET MVC Web应用程序来为我的数据库表执行CRUD操作。我遇到了错误
System.NullReferenceException
在运行程序时。
编写该代码是为了从2个表中检索记录:Report
和Member
。在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?.Name
或x.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();