C# EF中对象的限制

C# EF中对象的限制,c#,entity-framework,object,C#,Entity Framework,Object,为什么局部视图可以正确显示对象,但调用相同的函数来填充viewmodel会返回空值 类示例模型: [DisplayColumn("OrganizationName")] public class Organization { public int OrganizationId { get; set; } [Display(Name = "Organization Name"), MaxLength(75), Required] public string Organ

为什么局部视图可以正确显示对象,但调用相同的函数来填充viewmodel会返回空值

类示例模型:

[DisplayColumn("OrganizationName")] 
public class Organization
{
    public  int OrganizationId { get; set; }
    [Display(Name = "Organization Name"), MaxLength(75), Required]
    public  string OrganizationName { get; set; }
    [Display(Name = "Positions")]
    public int? PositionId { get; set; } 
    [Display(Name = "OrganizationSupervisor")]
    public int? OrganizationSupervisorId { get; set; }
    public virtual Organization PrimaryParentOrg { get; set; }
    [Display(Name = "All Positions")]
    public virtual ICollection<Position> OrgPositions { get; set; } 
    [ForeignKey("OrganizationSupervisorId")]
    [InverseProperty("Orgs")]
    public virtual OrganizationSupervisor Supervisor { get; set; } 
}
public class OrganizationSupervisor
{
    [Key]
    public int OrganizationSupervisorId { get; set; }
    [Required]
    public  Position SupervisorPos { get; set; }
    public int? OrganizationId { get; set; }
    [ForeignKey("OrganizationId")]
    public virtual ICollection<Organization> Orgs { get; set; }
}
public class Position
{
    public int PositionId { get; set; }
    public string DefaultTitle { get; set; }    
}
[DisplayColumn(“组织名称”)]
公营班级组织
{
public int OrganizationId{get;set;}
[显示(Name=“组织名称”),最大长度(75),必填]
公共字符串OrganizationName{get;set;}
[显示(Name=“Positions”)]
public int?PositionId{get;set;}
[显示(Name=“OrganizationSupervisor”)]
公共int?OrganizationSupervisorId{get;set;}
公共虚拟组织PrimaryParentOrg{get;set;}
[显示(Name=“所有位置”)]
公共虚拟ICollection OrgPositions{get;set;}
[ForeignKey(“OrganizationSupervisorId”)]
[反向属性(“组织”)]
公共虚拟组织主管{get;set;}
}
公营班级组织督导
{
[关键]
公共int OrganizationSupervisorId{get;set;}
[必需]
公共位置监督员{get;set;}
公共int?组织ID{get;set;}
[外键(“组织ID”)]
公共虚拟ICollection组织{get;set;}
}
公共阶级地位
{
public int PositionId{get;set;}
公共字符串DefaultTitle{get;set;}
}
//出现故障的功能:

public class fcns
{
    private static Position getEmpPosSup(Position EmpPos, Organization Org, ref int Cnt)
    {
        Position PosSup = null;
        Cnt++;
        if ((EmpPos != null) && (Org != null))
        {
            if (Org.Supervisor != null)
                if (Org.Supervisor.SupervisorPos != null)
                    if (EmpPos != Org.Supervisor.SupervisorPos)
                        PosSup = Org.Supervisor.SupervisorPos;
            if (PosSup == null && Cnt < 3)
            {
                //  Try the next level up, up to 3 times then give up
                PosSup = getEmpPosSup(EmpPos, Org.PrimaryParentOrg, ref Cnt);
            }
        }
        return PosSup;
    }
}
公共类fcns
{
私有静态职位GetEmpPosUp(职位EmpPos,组织机构,参考int Cnt)
{
位置PosSup=null;
Cnt++;
如果((EmpPos!=null)和&(Org!=null))
{
如果(Org.Supervisor!=null)
如果(Org.Supervisor.SupervisorPos!=null)
if(EmpPos!=Org.Supervisor.SupervisorPos)
PosSup=Org.Supervisor.SupervisorPos;
if(PosSup==null&&Cnt<3)
{
//尝试下一个级别,最多3次,然后放弃
PosSup=getempposup(EmpPos,Org.PrimaryParentOrg,ref-Cnt);
}
}
回归;
}
}
该函数返回相对于指定组织提交的职位的主管职位。

@BrianLegg

你说得对,谢谢你的建议。问题是延迟加载或类似的问题。我发现似乎总是有效的解决方案是使用存储库函数AllIncluding(…)而不是All函数。例如,我使用:

IQueryable<OrganizationSupervisor> lstOrgSups = organizationsupervisorRepository.AllIncluding(organizationsupervisor => organizationsupervisor.SupervisorPos);
IQueryable lstOrgSups=OrganizationSupervatorRepository.AllIncluding(organizationsupervisor=>organizationsupervisor.SupervisorPos);

这似乎迫使EF返回SupervisorPosition对象,如果在调试会话期间未被询问,该对象将返回null。

我的第一反应是:请使用更好的方法/类/变量名。很难确定你想做什么。(这不是一个答案,所以留作评论)你也可以发布你的视图代码,或者其中的一部分。您如何调用此函数?//失败的函数:函数以何种方式失败?在两种情况下,您如何调用它以及得到的结果是什么?为什么不压缩这些if语句+1到Pheonixblad9以获取类型名称建议。代码可能更具可读性。