Entity framework core 如果您试图包含的属性为null,则调用实体框架核心2.0中的Include会使实体为null

Entity framework core 如果您试图包含的属性为null,则调用实体框架核心2.0中的Include会使实体为null,entity-framework-core,Entity Framework Core,我得到的EF核心实体如下: Audit audit = _auditRepo.Audits .Include(a => a.Status) .Include(a => a.AuditType) .Include(a => a.Office) .Include(a => a.LeadOffice) .Include(a => a.External)

我得到的EF核心实体如下:

Audit audit = _auditRepo.Audits
            .Include(a => a.Status)
            .Include(a => a.AuditType)
            .Include(a => a.Office)
            .Include(a => a.LeadOffice)
            .Include(a => a.External)
            .Include(a => a.External).ThenInclude(e => e.AuditResult)
            .Include(a => a.External).ThenInclude(e => e.PreparerType)
            .Include(a => a.External).ThenInclude(e => e.Auditee)
            .Where(a => a.AuditID == id)
            .FirstOrDefault();
我的审计结果为空,因为它没有办公室。如果我有一个办公室,审计就会被填充

如果我没有办公室,但我发表评论:

.Include(a => a.Office) 
审计也会返回

这是我的审计实体:

[Table("audit")]
public class Audit
{
    private string _auditAcnCd;
    private string _title;
    private string _summary;

    [Key]
    [Column("audit_id")]
    public int AuditID { get; set; }

    [Required(ErrorMessage = "ACN Required")]
    [Display(Name="ACN:")]
    [Column("audit_acn_cd")]
    public string AuditAcnCd
    {
        get
        {
            return _auditAcnCd;
        }
        set
        {
            _auditAcnCd = value?.Trim();
        }
    }

    [Required(ErrorMessage = "Title Required")]
    [Display(Name = "Title:")]
    [Column("audit_report_title_tx")]
    public string Title
    {
        get
        {
            return _title;
        }
        set
        {
            _title = value?.Trim();
        }
    }

    [StringLength(maximumLength: 1000, ErrorMessage = "Max Length: 1000")]
    [Display(Name = "Summary:")]
    [Column("audit_summary_tx")]
    public string Summary
    {
        get
        {
            return _summary;
        }
        set
        {
            _summary = value?.Trim();
        }
    }

    [Required(ErrorMessage = "Issuer Required")]
    [Display(Name="Issuer:")]
    [Column("audit_issuer_tx")]
    public string Issuer { get; set; }

    [RegularExpression("([1-9][0-9]*)", ErrorMessage = "Priority must be a number.")]
    [Display(Name = "Priority:")]
    [Column("audit_priority_cd")]
    public short? Priority { get; set; }

    [Display(Name = "Lead Office:")]
    [Column("audit_lead_office_id")]
    public short? LeadOfficeID { get; set; }

    #region Navigation Properties
    [Required(ErrorMessage = "Audit Type Required.")]
    [Display(Name = "Audit Type:")]
    [Column("audit_audit_type_id")]
    public short AuditTypeID { get; set; }
    [Display(Name = "Audit Type:")]
    public AuditType AuditType { get; set; }

    [Column("audit_status_id")]
    public int StatusID { get; set; } 
    public Status Status { get; set; }

    [Required(ErrorMessage = "Office is Required.")]
    [Display(Name = "Offices:")]
    [Column("audit_office_id")]
    public short? OfficeID { get; set; }
    // [ForeignKey("OfficeID")]
    public Office Office { get; set; }

    [ForeignKey("AuditID")]
    public External External { get; set; }

    public IEnumerable<AuditLog> AuditLogs { get; set; }
    public IEnumerable<Finding> Findings { get; set; }
    public IEnumerable<Assignment> Assignments { get; set; }

    [Column("audit_update_staff_id")]
    public short UpdateStaffID { get; set; }

    [Column("audit_fsa_office_id")]
    [Display(Name = "FSA Audit Lead:")]
    public int? FsaLeadOfficeId { get; set; }
    [Display(Name = "FSA Audit Lead:")]
    [ForeignKey("FsaLeadOfficeId")]
    public FSAOffice FsaLeadOffice { get; set; }

    [ForeignKey("LeadOfficeID")]
    public Office LeadOffice { get; set; }
}
[表(“审计”)]
公开课审计
{
私有字符串\u auditAcnCd;
私有字符串\u标题;
私有字符串\u摘要;
[关键]
[列(“审计id”)]
public int audited{get;set;}
[必需(ErrorMessage=“ACN必需”)]
[显示(Name=“ACN:”)]
[栏目(“审计acn cd”)]
公共字符串AuditAcnCd
{
得到
{
返回_auditAcnCd;
}
设置
{
_auditAcnCd=值?.Trim();
}
}
[必需(ErrorMessage=“Title Required”)]
[显示(Name=“Title:”)]
[栏目(“审计报告标题”)]
公共字符串标题
{
得到
{
返回标题;
}
设置
{
_title=值?.Trim();
}
}
[StringLength(最大长度:1000,ErrorMessage=“最大长度:1000”)]
[显示(Name=“Summary:”)]
[栏目(“审计摘要”)]
公共字符串摘要
{
得到
{
返回(u)摘要;;
}
设置
{
_summary=值?.Trim();
}
}
[必需(ErrorMessage=“发卡机构必需”)]
[显示(Name=“发卡机构:”)]
[列(“审计发行人发送”)]
公共字符串颁发者{get;set;}
[RegularExpression(([1-9][0-9]*),ErrorMessage=“优先级必须是数字。”)]
[显示(Name=“Priority:”)]
[栏目(“审计优先权光盘”)]
公共短消息?优先级{get;set;}
[显示(Name=“领导办公室:”)]
[栏(“审计领导办公室id”)]
公共短消息?LeadOfficeID{get;set;}
#区域导航属性
[必需(ErrorMessage=“审计类型必需”)]
[显示(Name=“审核类型:”)]
[列(“审计类型id”)]
公共短审核类型ID{get;set;}
[显示(Name=“审核类型:”)]
公共审核类型审核类型{get;set;}
[列(“审计状态id”)]
public int StatusID{get;set;}
公共状态状态{get;set;}
[必需(ErrorMessage=“需要办公室”)]
[显示(Name=“Offices:”)]
[栏目(“审计办公室id”)]
公共短?OfficeID{get;set;}
//[外键(“OfficeID”)]
公共办公室{get;set;}
[外键(“试听”)]
公共外部{get;set;}
公共IEnumerable审核日志{get;set;}
公共IEnumerable发现{get;set;}
公共IEnumerable赋值{get;set;}
[栏(“审计更新员工id”)]
公共短更新分支{get;set;}
[栏目(“审计办公室id”)]
[显示(Name=“FSA审核负责人:”)]
public int?FsaLeadOfficeId{get;set;}
[显示(Name=“FSA审核负责人:”)]
[ForeignKey(“FsaLeadOfficeId”)]
公共fsa办公室FsaLeadOffice{get;set;}
[ForeignKey(“LeadOfficeID”)]
公共办公室领导办公室{get;set;}
}
这是我的办公室实体:

[Table("office")]
public class Office
{
    private string _OfficeCd;
    private string _OfficeNm;
    private string _OfficeOrganizationCd;

        [Key]
    [Column("office_id")]
    public short OfficeID { get; set; }

    [Required(ErrorMessage = "Numeric Code is required")]
    [StringLength(2, ErrorMessage = "Max Length is two")]
    [Display(Name = "Office Numeric Code:")]
    [Column("office_cd")]
    public string OfficeCd
    {
        get
        {
            return _OfficeCd;
        }
        set
        {
            _OfficeCd = value?.Trim();
        }
    }
    [Required(ErrorMessage = "Office Name is required")]
    [Display(Name = "Office Name:")]
    [Column("office_nm")]
    public string OfficeNm
    {
        get
        {
            return _OfficeNm;
        }
        set
        {
            _OfficeNm = value?.Trim();
        }
    }


    [Required(ErrorMessage = "Office Abbreviation is required")]
    [Display(Name = "Office Abbreviation:")]
    [Column("office_organization_cd")]
    public string OfficeOrganizationCd
    {
        get
        {
            return _OfficeOrganizationCd;
        }
        set
        {
            _OfficeOrganizationCd = value?.Trim();
        }
    }


    [Display(Name = "Status:")]
    [Column("office_active_cd")]
    public string OfficeActiveCd { get; set; }

    [Display(Name = "Parent Office:")]
    [Column("office_parent_id")]
    public short? OfficeParentId { get; set; }
    [Display(Name = "Parent Office:")] 
    [ForeignKey("OfficeParentId")]
    public Office ParentOffice { get; set; }

    public List<StaffOffice> StaffOffices { get; set; }
}
[表格(“办公室”)]
公课办公室
{
私人字符串(u OfficeCd),;
私人字符串(办公室);;
私人字符串(u OfficeOrganizationCd);
[关键]
[栏目(“办公室id”)]
公共short-OfficeID{get;set;}
[必需(ErrorMessage=“需要数字代码”)]
[StringLength(2,ErrorMessage=“最大长度为2”)]
[显示(Name=“Office数字代码:”)]
[栏目(“办公室光盘”)]
公共字符串办公室
{
得到
{
返回办公室;
}
设置
{
_OfficeCd=值?.Trim();
}
}
[必需(ErrorMessage=“需要办公室名称”)]
[显示(Name=“办公室名称:”)]
[栏目(“办公室”)]
公职人员
{
得到
{
返回办公室;
}
设置
{
_OfficeNm=值?.Trim();
}
}
[必需(ErrorMessage=“需要办公室缩写”)]
[显示(Name=“Office缩写:”)]
[专栏(“办公室、组织、光盘”)]
公共字符串组织CD
{
得到
{
返回办公室组织CD;
}
设置
{
_OfficeOrganizationCd=值?.Trim();
}
}
[显示(Name=“Status:”)]
[栏目(“办公室活动光盘”)]
公共字符串OfficeActiveCd{get;set;}
[显示(Name=“上级办公室:”)]
[栏目(“办公室家长id”)]
公共short-OfficeParentId{get;set;}
[显示(Name=“上级办公室:”)]
[外键(“OfficeParentId”)]
公共办公室父办公室{get;set;}
公共列表staffice{get;set;}
}

我所有的其他财产工作正常。我是否需要在
onModelCreating
中对此进行配置?

解释很简单-实体模型和数据库之间存在差异

当FK像您的
OfficeId
一样可以为空时,关系是可选的,EF Core希望列可以为空,并在检索相关数据时使用左外联接(通过
Include
请求)

但在某些时候,您似乎向FK属性添加了
[Required]
属性:

[Required(ErrorMessage = "Office is Required.")] // <-- the problem
[Display(Name = "Offices:")]
[Column("audit_office_id")]
public short? OfficeID { get; set; }
// [ForeignKey("OfficeID")]
public Office Office { get; set; }

[必需(ErrorMessage=“Office is Required.”]//我明白你的意思。我们需要它,因为应用程序有两种审计。内部和外部。我们在编写内部程序时,需要办公室。既然我们使用的是外部的,就不需要它了,因此可以为空的OfficeId。我可能只是用Officepo那样做。这只是一个详细信息页面。此外,我们正在重建此应用程序,以便数据库已经存在。您必须非常小心处理影响数据库映射的数据注释(属性)。最好使用单独的ViewModel类