8

Entity Framework を使用してデータベース スキーマを作成し、コードを生成しました。DaysOff テーブルに子レコードを持つ Employee というテーブルがあります。DaysOff には Employee への外部キーがあり、モデルには 1 to * の関連付けがあります。Employee テーブルで LINQ クエリを実行し、Domain.Employee オブジェクトに DaysOff が設定されると予想しましたが、DaysOff は null です。オブジェクトをドリルダウンすると、「employee.DaysOff.Count が System.ObjectDisposedException 型の例外をスローしました」と表示されます。子レコードが入力されると考えるのは間違っていますか? どうすればいいですか?従業員を取得するために呼び出すメソッドは次のとおりです。

public static Domain.Employee SelectEmployee(int employeeId)
{
    using (var db = new EmployeeEntities())
    {

        Domain.Employee emp = (from e in db.Employees
                       where e.EmployeeId == employeeId
                       select e
                             ).FirstOrDefault();

        return emp;
    }
}

編集:以下の受け入れられた回答とコメント(すべて賛成票)の組み合わせは、これを解決するのに役立ちました(イェーイ!):

public static Domain.Employee SelectEmployee(int employeeId)
{
    using (var db = new EmployeeEntities())
    {

        Domain.Employee emp = (from e in db.Employees.Include("DaysOff")
                       where e.EmployeeId == employeeId
                       select e).FirstOrDefault();

        return emp;
    }
}
4

2 に答える 2

11

子レコードが入力されると考えるのは間違っていますか?

が怠惰に取り込まれている可能性があると推測していますが、その時点までに破棄されいます。次のようなことを試してみてください。DaysOffEmployeeEntities

using (var db = new EmployeeEntities().Include("Employee.DaysOff"))

また、ステートメント内のコードは次のusingように簡単に記述できることに注意してください。

return db.Employees.FirstOrDefault(e => e.EmployeeId == employeeId);

編集

上記のコードは正しくありません。orIncludeで使用する必要があり、 /には適用できません。正しい使い方は次のとおりです。ObjectQuery<T>IQueryable<T>ObjectContextDbContext

using (var db = new EmployeeEntities())
{
    return db.Employees.Include("DaysOff")
        .FirstOrDefault(e => e.EmployeeId == employeeId);
}
于 2012-07-20T15:38:41.747 に答える
4

これは、子エンティティの読み込みに関するポスト トークです。

EF 4.1 での DbContext の使用パート 6: 関連エンティティの読み込み

関連するエンティティを積極的に読み込む

 // Load all prents and related childs
    var princesses1 = context.Parent
                          .Include(p => p.childs)
                          .ToList();

関連エンティティの明示的な読み込み

var parent = context.parent.Find(1);
    context.Entry(parent)
        .Collection(p => p.childs)
        .Load();
于 2012-07-20T15:40:55.443 に答える