如何使用实体框架从数据库视图加载相关实体?

时间:2016-05-09 13:49:48

标签: c# entity-framework

我一直在努力解决数据库视图的“一对多”关系。

我使用实体框架,我有这个“简化”模型:

“课程”实体。 “学生”实体。

课程可以有很多学生。

以下代码可以正常使用:

public class Course
{
    public int Id { get; set; }
    public virtual List<Student> Students { get; set; }
}
public class Sudent
{
    public int CourseId { get; set; }
    public virtual Course Course { get; set; }
}


private List<Course> GetCourses()
{
    List<Course> courses;
    using (var db = context ?? new MyContext())
    {
        courses = (from course in db.Courses select course)
                    .Include(l => l.Students)
                    .ToList();
    }
}

这是我的MyContext:

public class MyContext : DbContext
{
    protected MyContext()
    {}
    public virtual DbSet<Course> Courses { get; set; }
    public virtual DbSet<OpenCourse> OpenCourses { get; set; }
}

我有一个“OpenCourses”视图,可以获得所有开放的课程。

public class OpenCourse
{
    public int Id { get; set; }
    public virtual List<Student> Students { get; set; }
}

private List<OpenCourse> GetOpenCourses()
{
    List<Course> courses;
    using (var db = context ?? new MyContext())
    {
        courses = (from course in db.OpenCourses select course)
                    .Include(l => l.Students)
                    .ToList();
    }
}

当我运行它时,我得到以下内部异常: “无效的列名'OpenCourse_Id'。”

我知道我不得不将OpenCourse视图与许多学生联系起来。 但是如何?

我希望在我的方法和我的lambda表达中做到这一点。

2 个答案:

答案 0 :(得分:0)

你没有从学生到开放课程的关系属性。

你可以像这样添加它。

public class Student
{
    public int CourseId { get; set; }
    public int OpenCourseId { get; set; }
    public virtual Course Course { get; set; }
}

但此时,我认为您需要检查您的域名设计。

同时检查n到m的关系。 https://stackoverflow.com/a/8927380/465536

答案 1 :(得分:0)

您需要覆盖OnModelCreating对象的MyContext方法。实体框架还有一些其他方法来定义模型本身的关系,但这不太适用于您当前的设置(多个实体拥有一组学生)。

我假设您的OpenCourses视图实际上是Courses表的包装器。这意味着我假设Student.CourseId也是OpenCourses的外键。

考虑到这一点,这就是OnModelCreating 可能的样子

public class MyContext : DbContext
{
    protected MyContext()
    {}
    public virtual DbSet<Course> Courses { get; set; }
    public virtual DbSet<OpenCourse> OpenCourses { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<OpenCourse>()
        .HasMany<Student>(p => p.Students)
        .WithRequired()
        .HasForeignKey(p => p.CourseId);

    base.OnModelCreating(modelBuilder);
}