【问题标题】:Show data in one view in one to many relationship .net entity framework在一对多关系.net实体框架中的一个视图中显示数据
【发布时间】:2018-11-12 07:47:13
【问题描述】:

我的数据库中有两个表:学生(多)和部门(一个)以及一对多关系。我想为每个 StudentName 显示一个包含 DepartmentName 的列表,但我收到此错误:System.NullReferenceException: Object reference not set to an instance of an object。

这是我的控制器代码(该代码适用于一对一关系):

        public ActionResult Index()
    {

        List<Students> studlist = db.Students.ToList();
        StudentViewModel studlistVM = new StudentViewModel();

        List<StudentViewModel> studlistVMList = studlist.Select(x => new StudentViewModel
        {
            StudID = x.StudID,
            StudName = x.StudName,
            DeptName = x.deptobj.DeptName


        }).ToList();


        return View(studlistVMList);
    }

【问题讨论】:

  • 错误出现在哪一行?
  • Harald 的回答应该可以帮助您。我的猜测是您在 Student 上的“deptobj”未设置为虚拟,因此它不会延迟加载。在任何情况下都不应依赖延迟加载,因此 Harald 介绍了如何更好地从 DbContext 中选择相关数据,而不是在一个实体类型上使用 ToList() 然后尝试通过渴望或延迟从相关数据中填充视图模型加载中..

标签: c# .net asp.net-mvc entity-framework one-to-many


【解决方案1】:

唉,你忘了向我们展示你的课程。如果您关注entity framework code first conventions,您将获得类似于以下的课程:

class Department
{
    public int Id {get; set;}
    ...

    // Every department has zero or more Students (one-to-many)
    public virtual ICollection<Student> Students {get; set;}
}

class Student
{
    public int Id {get; set;}
    ...

    // every Student belongs to exactly one department, using foreign key
    public int DepartmentId {get; set;}
    public virtual Department Department {get; set;}
}

还有你的 DbContext

class UniversityContext : DbContext
{
     public DbSet<Department> Departments {get; set;}
     public DbSet<Student> Students {get; set;}
}

这是 Entity Framework 识别表、表中的列以及表之间的一对多关系所需要知道的全部内容

注意:在实体框架中,表中的列由 非虚拟属性。虚拟属性表示关系 桌子之间

虚拟属性让您的生活更轻松,因为您不再需要进行(组)加入。只需使用虚拟集合,实体框架就会将其转换为正确的连接。

我想为每个 StudentName 显示一个包含 DepartmentName 的列表,

var result = universityDbContext.Students
    .Where(student => ...)                 // only if you don't want all Students
    .Select(student => new
    {
        // select only the properties you plan to use
        Id = student.Id,
        StudentName = student.Name,

        DepartmentName = student.Department.Name,
    });

因为你使用了student.Department,所以实体框架知道需要SQL join

如果您想要一个平面 SQL 连接,请从“多”端开始,然后使用 虚拟财产到“一”侧。如果您想要分组加入,请开始 与“一”侧并使用虚拟 ICollection 到“多” 一边。

你想要一个平面连接,但如果你想要Departments with their Students,你会这样做:

var result = myDbContext.Departments
    .Where(department => ...)             // if you don't want all departments
    .Select(department => new
    {
        // select only the properties you plan to use
        Id = department.Id,
        Name = department.Name,

        StudentsWithHighGrades = department.Students
            .Where(student => student.Grade >= ...)
            .Select(student => new
            {
                Id = student.Id,
                Name = student.Name,
                Grade = student.Grade,
                ...
            })
            .ToList();
    });

【讨论】:

  • 谢谢你,哈拉德!我在我的控制器中使用了这段代码: public ActionResult Index() { UniversityContext db = new UniversityContext(); var results = db.Departments .Select(department => new { ID = department.Id, Name = department.DepName, }).ToList();返回视图(结果);使用视图模型,但我收到此错误:
猜你喜欢
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 2016-07-01
  • 2021-11-17
相关资源
最近更新 更多