2

私は新しい .NET 開発者です。このような2つのエンティティクラスがあります

public class Student
{
    public int userId { get; set; }
    public string username { get; set; }
    public string firstname { get; set; }
    public string lastname { get; set; }
    public string email { get; set; }
    public Course course { get; set; }
}

public class Course
{
    [Key]
    public int courseId { get; set; }
    public String courseName { get; set; }
}

このようにDBコンテキストオブジェクトを使用しています

using (MyDbContext db = new MyDbContext())

を使用して Student オブジェクトにアクセスすると、

Student stdent = db.students.Find(1);

学生オブジェクトのネイティブ型 (int,string) のメンバー変数には値が含まれていますが、型 (Course) のコース変数は null を返します。

一方、私が使用するとき

var result = from student in db.students where student.userId == 1 select student;

結果にはすべてのメンバー変数の値が含まれます (コース オブジェクト全体がここに存在します)

これは予期された動作ですか、それとも何かが欠けているか見落としていますか?

このコンストラクターを DB コンテキストに追加して、遅延読み込みを無効にしましたが、役に立ちませんでした

    public MyDbContext() : base()
    {
        this.Configuration.LazyLoadingEnabled = false;
    }
4

2 に答える 2

0

ここで何が起こるかというと、最初のケース (Find) では、データベースからオブジェクトを取得します。Courseは遅延読み込みではないため、Course参照はnull.

2 番目のケースでは、クエリを定義するだけで実行はしません。その後、結果をループして、存在するかどうかを同時に確認すると仮定しますCourse。実行時にナビゲーション プロパティにCourseアクセスするため、それが読み込まれる原因となり、クエリの一部になっています。Course

もしあなたがそうするなら

var s = (from student in db.students where student.userId == 1 select student)
        .Single();

クエリが実行された時点 (ステートメント)Courseへの参照なしで学生がフェッチされるため、これが空であることに気付くでしょう。CourseSingle

于 2013-03-01T07:47:08.663 に答える
0

遅延読み込みでは、最初のオブジェクトのみが読み込まれます。コース情報を取得するための 2 番目のオプションを取得するには、ロード オプションで指定する必要があります。

DataLoadOptions dataLoadOptions = new DataLoadOptions();
dataLoadOptions.LoadWith<Customer>(c => c.Course);
db.LoadOptions = dataLoadOptions;

Student stdent = db.students.Find( c=>c.userid == 1).FirstOrDefault();
于 2013-03-01T06:06:23.897 に答える