类型类的 DbSet 属性返回 null

时间:2021-07-27 19:11:16

标签: entity-framework asp.net-core asp.net-web-api entity-framework-core

我正在为应用创建 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?

1 个答案:

答案 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 将不起作用

相关问题