2016-05-09 124 views
0

我一直在努力處理關於數據庫視圖的「一對多」關係。如何使用實體框架從數據庫視圖加載相關實體?

進出口使用實體框架和我有這樣的「簡化」模式:

A「場」的實體。 「學生」實體。

課程可以有許多學生。

下面的代碼工作正常:

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

該協會通常將數據庫上下文對象內完成。你能發佈'MyContext'的代碼嗎? – cmcquillan

+0

是的。我已經看到了。但我沒有成功。任何想法如何? – Gradde

回答

0

您將需要覆蓋MyContext對象的OnModelCreating方法。實體框架還有其他一些方法來定義模型本身的關係,但這不太可能與當前的設置(多個實體有一組學生)一起工作。

我假設你的OpenCourses視圖實際上是你的課程表的一個包裝。這意味着我假設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); 
} 
+1

精美的作品。直接開箱!謝謝。 – Gradde

0

您沒有關係屬性,從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

+0

嗯..我不想將OpenCourseId屬性添加到實體學生爲了讓我的視圖正常工作。 – Gradde

+0

我知道我的域設計在我的例子中是真的很糟糕。在現實生活中,我沒有這些實體。它更復雜。但那不是重點。重點是:如果我有一個數據庫視圖返回與表相同的列,那麼當我使用實體框架引用該視圖時,如何使關係正常工作?特別是在我的例子中:一對多。 – Gradde