繁体   English   中英

使用实体框架时如何填充导航属性

[英]how to populate navigational properties when using Entity Framework

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

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;
}

在您的投影中,您还需要实例化Student_Model (同样,我建议在Where之后投影,并使用lambda表达式而不是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这样的库非常适合抽象这种事情。

以下是我为您创建的一个简单示例

public class STUDENTS
{
    public STUDENTS()
    {
        COURSES = new List<COURSES>();
    }
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ST_ROWID { get; set; }

    public int ST_NAME { get; set; }

    [ForeignKey("CR_SM_REFNO")]
    public virtual List<COURSES> COURSES { get; set; }
}

public class COURSES
{
    [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CR_ROWID { get; set; }

    public string CR_NAME { get; set; }

    public int CR_SM_REFNO { get; set; }

    [ForeignKey("CR_SM_REFNO")]
    public virtual STUDENTS STUDENTS { get; set; }
}

并通过以下方法完成工作:

// gets the list of courses taken by the student id 
public List<COURSES> GetCoursesByStudent(int pST_ROWID)
    {
        using (var con = new MPContext())
        {
            return con.COURSES.Include(x=>x.STUDENTS).
                                Where(x => x.CR_SM_REFNO.Equals(pST_ROWID)).ToList();
        }
    }

    //Gets the list of students who get the course with the course id
    public List<STUDENTS> GetStudentsByCourse(int pCR_ROWID)
    {
        using (var con = new MPContext())
        {
            return con.STUDENTS.Include(x => x.COURSES).
                Where(x => x.COURSES.Any(y=>y.CR_ROWID.Equals(pCR_ROWID))).ToList();
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM