【问题标题】:How do I load related entities from a database view using entity framework?如何使用实体框架从数据库视图加载相关实体?
【发布时间】:2016-05-09 13:49:48
【问题描述】:

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

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

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

一个课程可以有很多学生。

以下代码可以正常工作:

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 表达式中这样做。

【问题讨论】:

  • 这种关联通常在数据库上下文对象中完成。您可以发布MyContext 的代码吗?
  • 是的。我已经看到了。但我没有成功。关于如何做的任何想法?

标签: c# entity-framework


【解决方案1】:

您将需要覆盖MyContext 对象的OnModelCreating 方法。 Entity Framework 有一些其他方法来定义模型本身的关系,但这不太可能适用于您当前的设置(具有学生集合的多个实体)。

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

考虑到这一点,这就是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);
}

【讨论】:

  • 效果很好。直接开箱!谢谢。
【解决方案2】:

您没有从 Student 到 OpenCourse 的关系属性。

你可以这样添加。

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

【讨论】:

  • hmm.. 我不想将属性 OpenCourseId 添加到实体 Student 中,因为我的视图可以正常工作。
  • 我知道在我的示例中我的域设计非常糟糕。在现实生活中,我没有这些实体。它要复杂得多。但这不是重点。关键是:如果我有一个返回与表相同的列的数据库视图,当我使用实体框架引用该视图时,如何使关系正常工作?特别是在我的示例中:一对多。
猜你喜欢
  • 1970-01-01
  • 2014-10-23
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 2013-07-11
  • 2012-02-07
相关资源
最近更新 更多