"Nullable object must have a value" 当映射布尔?布尔?

"Nullable object must have a value" when Mapping bool? to bool?

在我的应用程序中,我从数据库中获取两个属性 IsLoopCarLoopStatusSet 并将它们存储到模型 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;
                }
            }
        }