C# 3外键到1表

C# 3外键到1表,c#,asp.net,entity-framework,asp.net-core,entity-framework-core,C#,Asp.net,Entity Framework,Asp.net Core,Entity Framework Core,我有一个用于保存用户信息的用户表和一个用于用户休假的表。在我的项目中,每个想要休假的人都会告诉一个人,这个人创建了一个请求,另一个人必须确认该请求。在用户的假期中,我有3列。一个用于名为userId的想要去度假的人,一个用于创建名为creatorUserId的请求的人,另一个用于确认名为acceptorId的人。问题是当我想显示接受人姓名时,我得到了空引用错误。 这是我的亲戚 public class User { public User() { }

我有一个用于保存用户信息的用户表和一个用于用户休假的表。在我的项目中,每个想要休假的人都会告诉一个人,这个人创建了一个请求,另一个人必须确认该请求。在用户的假期中,我有3列。一个用于名为
userId
的想要去度假的人,一个用于创建名为
creatorUserId
的请求的人,另一个用于确认名为
acceptorId
的人。问题是当我想显示接受人姓名时,我得到了空引用错误。 这是我的亲戚

    public class User
{
    public User()
    {

    }

    
    [Key] public int UserId { get; set; }

    [Display(Name = "نام کاربری")]
    [Required(ErrorMessage = "لطفا {0} را وارد نمایید")]
    [MaxLength(200, ErrorMessage = "{0} نمیتواند بیشتر از {1} کاراکتر باشد")]
    public string UserName { get; set; }
    [Display(Name = "نام ")]
    [Required(ErrorMessage = "لطفا {0} را وارد نمایید")]
    [MaxLength(200, ErrorMessage = "{0} نمیتواند بیشتر از {1} کاراکتر باشد")]
    public string FirstName { get; set; }
    [Display(Name = "نام خانوادگی")]
    [Required(ErrorMessage = "لطفا {0} را وارد نمایید")]
    [MaxLength(200, ErrorMessage = "{0} نمیتواند بیشتر از {1} کاراکتر باشد")]
    public string LastName  { get; set; }

    [Display(Name = "کد ملی")]
    [Required(ErrorMessage = "لطفا {0} را وارد نمایید")]
    
    [Range(0, 9999999999, ErrorMessage = "{0} نمیتواند بیشتر از {1} عدد باشد")]
    public string SocialNumber { get; set; }

    [Display(Name = "ایمیل")]
    [Required(ErrorMessage = "لطفا {0} را وارد نمایید")]
    [MaxLength(200, ErrorMessage = "{0} نمیتواند بیشتر از {1} کاراکتر باشد")]
    [EmailAddress(ErrorMessage = "ایمیل وارد شده معتبر نمی باشد.")]
    public string Email { get; set; }

    [Display(Name = "کد فعال سازی ایمیل")]
    [MaxLength(50, ErrorMessage = "{0} نمیتواند بیشتر از {1} کاراکتر باشد")]
    public string ActiveCodeEmail { get; set; }

    [Display(Name = "کلمه عبور")]
    [Required(ErrorMessage = "لطفا {0} را وارد نمایید")]
    [MaxLength(200, ErrorMessage = "{0} نمیتواند بیشتر از {1} کاراکتر باشد")]
    public string Password { get; set; }

    [Display(Name = "وضعیت")]
    public bool IsActive { get; set; }

    [Display(Name = "آواتار")]
    [MaxLength(200, ErrorMessage = "{0} نمیتواند بیشتر از {1} کاراکتر باشد")]
    public string UserAvatar { get; set; }

    [Display(Name = "تاریخ ثبت نام")]
    public DateTime RegisterDate { get; set; }

    public bool IsDelete { get; set; }

    #region Relations

    public  Collection<UserRole> UserRoles { get; set; }

  public Collection<UserVacation> UserVacations { get; set; }


    [InverseProperty("AcceptorUserId")]
    public Collection<UserVacation> aceeptorUserVacation { get; set; }


    [InverseProperty("CreatorId")]
    public Collection<UserVacation> CreatorIdUserVacation { get; set; }


    #endregion
我获取信息的方法

        public async Task<showVacationForReport> GetVacationByUserId(int id, int pageId = 1, int filter = 0, string fromDate = "", string toDate = "")
    {
        IQueryable<UserVacation> vacations = _context.UserVacations.Where(v => v.UserId == id);
        
        if (filter != 0)
        {
            switch (filter)
            {
                case 1:
                    vacations = vacations.Where(v => v.VacationType == 1);
                    break;
                case 2:
                    vacations = vacations.Where(v => v.VacationType == 2);
                    break;
                case 3:
                    vacations = vacations.Where(v => v.VacationType == 3);
                    break;
            }
        }

        if (!string.IsNullOrEmpty(fromDate))
        {
            DateTime FromDate = fromDate.ToMiladi();
            vacations = vacations.Where(v => v.ExitTime >= FromDate);
        }

        if (!string.IsNullOrEmpty(toDate))
        {
            DateTime ToDate = toDate.ToMiladi();
           vacations = vacations.Where(v => v.EnterTime <= ToDate);
        }
        //show item in page
        int take = 20;
        int skip = (pageId - 1) * take;

        showVacationForReport ShowReport = new showVacationForReport()
        {
            CurrentPage = pageId,
            PageCount = vacations.Count()/take,
            UserVacations = await vacations.Include(u=>u.User).Include(v=>v.Type).Skip(skip).Take(take).ToListAsync(),
        };
        return ShowReport;
    }
公共异步任务GetVacationByUserId(int-id,int-pageId=1,int-filter=0,string fromDate=,string toDate=)
{
IQueryable vacations=\u context.UserVacations.Where(v=>v.UserId==id);
如果(过滤器!=0)
{
开关(过滤器)
{
案例1:
休假=休假。其中(v=>v.VacationType==1);
打破
案例2:
休假=休假。其中(v=>v.VacationType==2);
打破
案例3:
休假=休假。其中(v=>v.VacationType==3);
打破
}
}
如果(!string.IsNullOrEmpty(fromDate))
{
DateTime FromDate=FromDate.ToMiladi();
休假=休假。其中(v=>v.ExitTime>=FromDate);
}
如果(!string.IsNullOrEmpty(toDate))
{
DateTime ToDate=ToDate.ToMiladi();
休假=休假。其中(v=>v.EnterTime u.User)。包括(v=>v.Type)。跳过(Skip)。接受(Take)。ToListSync(),
};
返回显示报告;
}

“问题是当我想显示接受方名称时,我得到了空引用错误”显示从数据库检索
UserVacation
(我猜是?)对象的代码。很可能您忘记打电话给
Include
(请参阅)谢谢您的回复。我发布我的方法。我包含用户表,只可以获取想要去度假的用户。好的,我看到您有
包含
用户
类型
,但没有
接受用户ID
(非直观名称顺便说一句,为什么不仅仅是
Acceptor
,结尾的
Id
听起来像FK标识符,而这是导航属性)这会导致空引用异常。是的,没错。我不包括AcceptorUserId。非常感谢。
        public async Task<showVacationForReport> GetVacationByUserId(int id, int pageId = 1, int filter = 0, string fromDate = "", string toDate = "")
    {
        IQueryable<UserVacation> vacations = _context.UserVacations.Where(v => v.UserId == id);
        
        if (filter != 0)
        {
            switch (filter)
            {
                case 1:
                    vacations = vacations.Where(v => v.VacationType == 1);
                    break;
                case 2:
                    vacations = vacations.Where(v => v.VacationType == 2);
                    break;
                case 3:
                    vacations = vacations.Where(v => v.VacationType == 3);
                    break;
            }
        }

        if (!string.IsNullOrEmpty(fromDate))
        {
            DateTime FromDate = fromDate.ToMiladi();
            vacations = vacations.Where(v => v.ExitTime >= FromDate);
        }

        if (!string.IsNullOrEmpty(toDate))
        {
            DateTime ToDate = toDate.ToMiladi();
           vacations = vacations.Where(v => v.EnterTime <= ToDate);
        }
        //show item in page
        int take = 20;
        int skip = (pageId - 1) * take;

        showVacationForReport ShowReport = new showVacationForReport()
        {
            CurrentPage = pageId,
            PageCount = vacations.Count()/take,
            UserVacations = await vacations.Include(u=>u.User).Include(v=>v.Type).Skip(skip).Take(take).ToListAsync(),
        };
        return ShowReport;
    }