2

私はEntityFrameworkを使用しており、次のクラスがあります

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を初期化し、データベースから入力する手順がありませんか?

4

3 に答える 3

3

クラスの生徒とメモは公開する必要があります。

次のコードが実行されます。

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; }        
}
于 2012-07-06T16:01:59.080 に答える
1

これを試して:

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 )
     ...
}

EntityFrameworkがデータの遅延読み込みを行うという事実に注意してください。したがって、それを実装するために何かをしなければ、それを取得することはできません。それを行う方法は他にもありますが、とりわけこのクエリは、生徒とメモの両方が必要であることを明確に文書化しています。

于 2012-07-06T15:53:41.933 に答える
0

これは仮想であってはなりません。

public virtual NoteID {get; set;} 

整数である必要があります。

public int NoteID {get; set;}
于 2012-07-06T15:43:39.007 に答える