您发布的示例显示了如何使用 EF Code-first 创建 Manager 的导航属性并将其映射到类型 Person -
public class Project
{
    public int ProjectId { get; set; }
    public string Name { get; set; }
    public int ManagerId { get; set; }
    // The following will use ManagerId as the foreign key and map it to PersonId, or w/e the key field is for person
    [ForeignKey("ManagerId")]
    public Person Manager { get; set; }
}
您的代码使用 SalesLine_Id 建立与 SalesLine 的外键关系,该关系是 SalesLine 类型。
public class SalesOrderLine : LoggedEntity { 
    [ForeignKey("SalesLine")] 
    [Column("SalesLine_Id")]  
    [Required] 
    public int SalesLine_Id { get; set; } 
    public SalesLine SalesLine { get; set; } 
}
重要的是要了解,除非您使用奇怪的命名约定,否则您可能不必使用所有注释来装饰您的类,因为 EF 会自动按照您希望的方式映射所有内容,只要名称是相当一致——
public class SalesOrderLine {
    public int SalesOrderLineId { get; set; }
    public string Description { get; set; }
    public int SalesLineId { get; set; } 
    public virtual SalesLine SalesLine { get; set; } 
}
public class SalesLine {
    public int SalesLineId { get; set; }
    public string Description { get; set; }
    public ICollection<SalesOrderLine> SalesOrderLines { get; set; }
}
作为一个例子,它工作得很好。如果您需要使关系更加复杂,您可能需要开始考虑使用 Fluent API 进行配置,但是如果没有数据注释,代码也可以正常工作。由于 SalesLineId 不可为空,因此它是必需的,EF 理解它是一个外键,并且一切都很好。