我正在为应用创建 API。我遇到问题的 DbContext 如下所示:
public class SchoolPlannerDbContext : DbContext
{
public SchoolPlannerDbContext(DbContextOptions<SchoolPlannerDbContext> options) : base(options) { }
public DbSet<Activity> Activities { get; set; }
public DbSet<Room> Rooms { get; set; }
public DbSet<Subject> Subjects { get; set; }
public DbSet<Teacher> Teachers { get; set; }
public DbSet<Group> Groups { get; set; }
}
Activity类如下:
public class Activity
{
public int ID { get; set; }
[Required]
public Teacher Teacher { get; set; }
[Required]
public Room Room { get; set; }
[Required]
public Subject Subject { get; set; }
[Required]
public Group Group { get; set; }
[Required]
public int Slot { get; set; }
[Required]
public int Day { get; set; }
}
所有其他属性都包含一个 int ID 和一个字符串 Name。
我的控制器如下所示:
public class SqlPlannerData : ISchoolPlannerData
{
private readonly SchoolPlannerDbContext db;
public SqlPlannerData(SchoolPlannerDbContext db)
{
this.db = db;
}
public IEnumerable<Activity> GetActivities()
{
return db.Activities;
}
public IEnumerable<Group> GetGroups()
{
return db.Groups;
}
}
GetGroups() 按预期工作并返回属性设置正确的 IEnumerable。
我的问题是,当我尝试访问 db.Activities 时,类型的属性,例如,Teacher(非基本类型,如 int)被设置为 null: Debugger screenshot。
然而,数据库中有一行looks like this。 IE。列存在于数据库中。
我该怎么做才能使 GetActivities() 返回具有正确设置的属性的 IEnumerable?
答案 0 :(得分:0)
由于延迟加载,某些属性为 null,您需要包含它们
return db.Activities
.Include(i => i.Teacher)
.Include(i => i.Room)
.Include(i => i.Subject)
.Include(i => i.Group)
.ToList()
每个属性 ID 都可以由 EF5+ 配置为阴影。但我通常更喜欢明确添加所有 Id。这样,当我在项目中使用 db 上下文时,我的问题就会少得多。但它是可选的,您可以保持原样
public class Activity
{
public int ID { get; set; }
[Required]
public int? TeacherId { get; set; }
[Required]
public int? RoomId { get; set; }
[Required]
public int? SubjectId { get; set; }
[Required]
public int? GroupId { get; set; }
public virtual Teacher Teacher { get; set; }
public virtual Room Room { get; set; }
public virtual Subject Subject { get; set; }
public virtual Group Group { get; set; }
[Required]
public int Slot { get; set; }
[Required]
public int Day { get; set; }
}
为了获得列表活动,您必须至少添加 ToList() 或 ToArray()
public IEnumerable<Activity> GetActivities()
{
return db.Activities.ToArray();
}
顺便说一下,您不能根据需要使用 not nullabe Id,因为它是相关的
[Required]
public int TeacherId { get; set; }
因为 int 默认为 0 并且它是一个有效值并且 required 将不起作用