为什么在设置 DetailNumber 时,详细信息的两个参数化构造函数都会引发空引用错误

本文关键字:构造函数 参数 错误 引用 两个 DetailNumber 设置 详细信息 为什么 | 更新日期: 2023-09-27 18:31:10

我有代码优先的模型。我正在尝试从构造函数中获取一个详细信息以自动设置自己的详细信息编号。这是我到目前为止所处的位置:

public class Header
{
    public Header()
    {
        Details = new List<Detail>();
    }
    [Key]
    public Guid Id { get; set; }
    [Required]
    public Guid CustomerId { get; set; }
    [ForeignKey("CustomerId")]
    public virtual Customer Customer { get; set; }
    public DateTime OrderDate { get; set; }
    public ICollection<Detail> Details { get; set; }
}

这是细节:

public class Detail
{
    public Detail(Guid id) : base()
    {
        HeaderId = id;
    }
    public Detail(Header header) : base()
    {
        Header = header;
    }
    private Detail()
    {
        DetailNumber = (Header.Details.Count) + 1;
    }
    [Key]
    public Guid Id { get; set; }
    [Required]
    public Guid HeaderId { get; set; }
    [ForeignKey("HeaderId")]
    public virtual Header Header { get; set; }
    public int DetailNumber { get; set; }
    [Required]
    public Guid ItemId { get; set; }
    [ForeignKey("ItemId")]
    public virtual InventoryItem Item { get; set; }
}

为什么在设置 DetailNumber 时,详细信息的两个参数化构造函数都会引发空引用错误?

为什么在设置 DetailNumber 时,详细信息的两个参数化构造函数都会引发空引用错误

使用此构造函数

public Detail(Guid id) : base()
{
    HeaderId = id;
}

您的标头为空,因为它从未初始化。我认为在第二个上,:base()是在参数化构造函数初始化 Header 之前执行的。

您可以稍微重新排列构造函数,以便在未传入构造函数时始终创建一个Header

public Detail() : this(Guid.NewGuid())
{
}
public Detail(Guid id) : this(new Header())
{
    HeaderId = id;
}
public Detail(Header header) 
{
    Header = header;
    DetailNumber = (Header.Details.Count) + 1;
}