繁体   English   中英

实体框架一对多

[英]Entity framework one to many

我正在使用Entity Framework,并且具有以下类

class Student
{
 [Key]
 public virtual int StudentID {get; set;}
 public virtual string StudentName {get; set;}
 public virtual ICollection<Note> Notes {get; set;}
}
class Note
{
 [Key]
 public virtual int NoteID {get; set;}
 public virtual int StudentID {get; set;}
 public virtual string Message {get; set;}
}
class StudentDBContext:DbContext
{
 public DbSet<Student> Students { get; set; }
 public DbSet<Note> Notes { get; set; }
}

综上所述,我有一班学生,每个学生都有很多笔记。 现在,我想使用Linq检索和显示特定学生的所有笔记。 所以我尝试

using (StudentDBContext a = new StudentDBContext())
{
 var b = from c in a.Student
         where c.StudentID == 1001
         select c;

 var currStudent = b.FirstOrDefault();
 Console.WriteLine(currStudent.StudentName);

  //display all the messages of the current student
  foreach (var currNote in currStudent.Notes)
  Console.WriteLine(currNote.Message);
}

在上面的代码中,因为Student.Notes始终为null,所以我的foreach块始终失败。 我是否缺少初始化Student.Notes并从数据库填充它的步骤?

您的班级学生和记事应公开。

运行以下代码:

class Program {
    static void Main(string[] args) {
        using ( StudentDBContext efc = new StudentDBContext()) {
            foreach (var v in efc.Students) {
                Console.WriteLine("{0}", v.StudentName);
                foreach (var vv in v.Notes) {
                    Console.WriteLine("    {0}", vv.Message);
                }
            }
        }
    }
}

public class Student {
    public Student() {
        //Notes = new List<Note>();
    }
     [Key]
     public int StudentID {get; set;}
     public virtual string StudentName {get; set;}
     public virtual ICollection<Note> Notes {get; set;}
}
public class Note {
 [Key]
 public int NoteID {get; set;}
 public int StudentID {get; set;}
 public string Message {get; set;}
}
class StudentDBContext:DbContext {
    public DbSet<Student> Students { get; set; }
    public DbSet<Note> Notes { get; set; }        
}

尝试这个:

using (StudentDBContext a = new StudentDBContext())
{
   var b = ((from c in a.Student
           join b in a.Notes on b.StudentId equals c.StudentId into sNotes
                 from notes in sNotes.DefaultIfEmpty()
           where c.StudentId==1001
           select c).SingleOrDefault();
   if (b != null )
     ...
}

请注意,Entity Framework会延迟加载数据。 因此,如果您不做任何事情来填充它,那么您将不会得到它。 还有其他方法可以执行此操作,但除其他外,此查询清楚地记录了您想要的学生和笔记。

这不应该是虚拟的。

public virtual NoteID {get; set;} 

它应该是一个整数:

public int NoteID {get; set;}

暂无
暂无

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

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