"Nullable object must have a value" 当映射布尔?布尔?
"Nullable object must have a value" when Mapping bool? to bool?
在我的应用程序中,我从数据库中获取两个属性 IsLoopCar
和 LoopStatusSet
并将它们存储到模型 class:
private static ChecklistModel MapChecklistModel(DataRow row)
{
var checklist = new ChecklistModel
{
IsLoopCar = Convert.IsDBNull(row["IsLoopCar"]) ? null : Convert.ToBoolean(row["IsLoopCar"]),
LoopStatusSet = Convert.IsDBNull(row["LoopStatusSet"]) ? null : Convert.ToBoolean(row["LoopStatusSet"])
}
}
在我的模型class和我映射模型class的viewModel中,这两个属性的数据类型是bool?
public class ChecklistModel
{
public bool? IsLoopCar { get; set; }
public bool? LoopStatusSet { get; set; }
}
public class GetPaymentInformationViewModel
{
public bool? IsLoopCar { get; set; }
public bool? LoopStatusSet { get; set; }
}
我的数据库中的属性值为 null
。当我使用 AutoMapper (7.0.1) 将模型映射到视图模型时,我收到一条我不理解的错误消息:
GetPaymentInformationViewModel gpivm = _mapper.Map<ChecklistModel, GetPaymentInformationViewModel>(checklist);
映射配置非常基础:
CreateMap<ChecklistModel, GetPaymentInformationViewModel>();
错误信息是:
InvalidOperationException: Nullable object must have a value.
我不明白映射可为 null 的布尔值有什么意义,因为它们必须具有值。当我将它传递给视图时,我需要将该值设置为 null,因为它作为一种检查点工作,用户必须 select 一个 yes/no 值且没有设置初始默认值。
根据 Lucian 的建议,我尝试使用新的控制台应用重现该问题,但并没有失败。事实证明,问题出在我的视图模型中,我在其中编写了一个没有意义的自定义 setter:
[Required]
[Display(Name = "IsLoopCar")]
public bool? IsLoopCar
{
get
{
return _IsLoopCar;
}
set
{
if (value.Value == true)
_IsLoopCar = value.Value;
else
{
_IsLoopCar = value.Value;
LoopStatusSet = null;
}
}
}
无法读取字段 value.Value,因为它不存在。应该是这样的:
[Required]
[Display(Name = "IsLoopCar")]
public bool? IsLoopCar
{
get
{
return _IsLoopCar;
}
set
{
if (value == true)
_IsLoopCar = value;
else
{
_IsLoopCar = value;
LoopStatusSet = null;
}
}
}
在我的应用程序中,我从数据库中获取两个属性 IsLoopCar
和 LoopStatusSet
并将它们存储到模型 class:
private static ChecklistModel MapChecklistModel(DataRow row)
{
var checklist = new ChecklistModel
{
IsLoopCar = Convert.IsDBNull(row["IsLoopCar"]) ? null : Convert.ToBoolean(row["IsLoopCar"]),
LoopStatusSet = Convert.IsDBNull(row["LoopStatusSet"]) ? null : Convert.ToBoolean(row["LoopStatusSet"])
}
}
在我的模型class和我映射模型class的viewModel中,这两个属性的数据类型是bool?
public class ChecklistModel
{
public bool? IsLoopCar { get; set; }
public bool? LoopStatusSet { get; set; }
}
public class GetPaymentInformationViewModel
{
public bool? IsLoopCar { get; set; }
public bool? LoopStatusSet { get; set; }
}
我的数据库中的属性值为 null
。当我使用 AutoMapper (7.0.1) 将模型映射到视图模型时,我收到一条我不理解的错误消息:
GetPaymentInformationViewModel gpivm = _mapper.Map<ChecklistModel, GetPaymentInformationViewModel>(checklist);
映射配置非常基础:
CreateMap<ChecklistModel, GetPaymentInformationViewModel>();
错误信息是:
InvalidOperationException: Nullable object must have a value.
我不明白映射可为 null 的布尔值有什么意义,因为它们必须具有值。当我将它传递给视图时,我需要将该值设置为 null,因为它作为一种检查点工作,用户必须 select 一个 yes/no 值且没有设置初始默认值。
根据 Lucian 的建议,我尝试使用新的控制台应用重现该问题,但并没有失败。事实证明,问题出在我的视图模型中,我在其中编写了一个没有意义的自定义 setter:
[Required]
[Display(Name = "IsLoopCar")]
public bool? IsLoopCar
{
get
{
return _IsLoopCar;
}
set
{
if (value.Value == true)
_IsLoopCar = value.Value;
else
{
_IsLoopCar = value.Value;
LoopStatusSet = null;
}
}
}
无法读取字段 value.Value,因为它不存在。应该是这样的:
[Required]
[Display(Name = "IsLoopCar")]
public bool? IsLoopCar
{
get
{
return _IsLoopCar;
}
set
{
if (value == true)
_IsLoopCar = value;
else
{
_IsLoopCar = value;
LoopStatusSet = null;
}
}
}