我一直在努力解决数据库视图的“一对多”关系。
我使用实体框架,我有这个“简化”模型:
“课程”实体。 “学生”实体。
课程可以有很多学生。
以下代码可以正常使用:
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表达中做到这一点。
答案 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);
}