C# 3外键到1表
我有一个用于保存用户信息的用户表和一个用于用户休假的表。在我的项目中,每个想要休假的人都会告诉一个人,这个人创建了一个请求,另一个人必须确认该请求。在用户的假期中,我有3列。一个用于名为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() { }
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;
}