为什么在设置 DetailNumber 时,Detail 的两个参数化构造函数都会抛出 Null Reference 错误?

Why do both of the Parameterized Constructors for Detail throw Null Reference errors when setting the DetailNumber?

我有代码优先模型。我试图从构造函数中获取一个细节以自动设置它自己的细节编号。这是我到目前为止的位置:

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 时,Detail 的两个参数化构造函数都抛出 Null Reference 错误?

有了这个构造函数

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

您的 Header 为空,因为它从未被初始化。我认为在第二个 :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;
}