首页 > 解决方案 > 使用实体框架时如何填充导航属性

问题描述

我首先使用实体​​框架,数据库,并且需要一个很好的解决方案来解决以下问题我有一个实体说实体框架生成的课程

class Courses
{
     public Courses()
     {
         this.Students=new HashSet<Student>();
     }
     public int courseid{get;set;}
     public virtual ICollection<Student> Students{get;set}
}

Class Student
{
     public int id{get;set;}
     public string Name{get;set;}
}

我在与这些实体类对应的业务层中创建了模型类

 class Courses_Model
 {
     public Courses()
     {
        this.Students=new HashSet<Student>();
     }
     public int courseid{get;set;}
     public virtual ICollection<Student> Students{get;set}
}

Class Student_Model
{
     public int id{get;set;}
     public string Name{get;set;}
}

我想从我的 web api 方法返回模型类(Courses_Model),它应该包括导航属性学生而不是

public Courses GetCourses(string id)
{ 
    var course= (from g in con.Courses.Include("Student") where g.REQUESTER_REFERENCE == id select g).First();

    return course;
}

要返回 Courses_Model 我们可以在返回时创建新的 Courses_Model 对象,但我不知道如何填充

public Courses_Model GetCourses(string id)
{ 
    Course= con.Courses.Include("Student").Select(g => new Courses_Model{courseid=g.courseid }).Where(g => g.REQUESTER_REFERENCE == id).First();

    return course;
}

标签: c#asp.netentity-frameworklinqasp.net-web-api2

解决方案


在您的投影中,您还需要实例化Student_Model(我也建议在之后投影Where并使用 lambda 表达式而不是字符串 for Include):

public Courses_Model GetCourses(string id)
{ 
    Course= con.Courses.Include(x => x.Students)
            .Where(g => g.REQUESTER_REFERENCE == id)
            .Select(
                  g => new Courses_Model
                           {
                                courseid = g.courseid,
                                Students = g.Students.Select(x => new Student_Model { id = x.id, Name = x.Name })
                           })
            .First();

    return course;
}

另一方面,像AutoMapper这样的库非常适合抽象这种东西。


推荐阅读