2012-07-20 5 views
8

データベーススキーマを作成してコードを生成するために、Entity Frameworkを使用しました。私は、Employeeというテーブルを持っていて、そのテーブルには、DaysOffテーブルに子レコードがあります。 DaysOffにはEmployeeに対する外部キーがあり、私のモデルには1対1の関連があります。私はEmployeeテーブルでLINQクエリを実行し、私のDomain.EmployeeオブジェクトにDaysOffが設定されていて、DaysOffがnullであると予想していました。オブジェクトをドリルダウンすると、「employee.DaysOff.CountがSystem.ObjectDisposedException型の例外をスローしました」と表示されます。子供の記録に人が住むと思うのは間違っていますか?どうすればいい?ここで私は私の従業員を取得するために呼び出す方法は次のとおりです。LINQ子レコードnull

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; 
    } 
} 

はEDIT: 以下受け入れ答えの組み合わせとコメント(すべてのアップ投票は)この問題を解決するために私を助けた(イェーイ!):

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; 
    } 
} 
+0

はい。これは、遅延ロード/遅延実行と呼ばれるLINQの基本原理です。 http://www.rizalalmashoor.com/blog/linq-to-entities-deferred-execution-and-lazy-loadingのようないくつかの(多量の)ドキュメンテーションを読んで参考になるかもしれません。/ – mellamokb

+0

参照:http://msdn.microsoft.com/en-us/library/bb896272 – CodingGorilla

答えて

10

私は子供の記録にデータが入ると思っていますか?

私ははそれがDaysOffがいい加減に移入されますが、その時点でEmployeeEntitiesが配置されていることが考えられを推測しています。上記のコード

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

編集

を:using文のあなたのコードは単純のように書かれることになることにも注意してください

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

:あなたは次のような何かをしようとする場合があります正しいものではありません。 IncludeObjectQuery<T>またはIQueryable<T>で使用する必要があり、ObjectContext/DbContextには適用できません。正しい使用法は次のとおりです。

ここ
using (var db = new EmployeeEntities()) 
{ 
    return db.Employees.Include("DaysOff") 
     .FirstOrDefault(e => e.EmployeeId == employeeId); 
} 
+0

@CodingGorilla:私は少し混乱しています。彼は 'ObjectDisposedException'を取得しました。それは確実に遅延ロードが有効になっていますか?または私は何かを逃していますか? – Chris

+1

Jon、あなたは既にEFバージョン19になっています:)(コンテキストインスタンス全体に対して「自動eager-loading」を有効にします)。現在のところ 'Include'をコンテキストに適用することはできませんが、個々のクエリの中に' Include'を置く必要があります: 'return db.Employees.Include(" DaysOff ")。FirstOrDefault ...'など – Slauma

+0

Chris、 '彼' = '彼女'。;) Slauma、ご意見ありがとうございます。あなたが私の問題を解決するのを手伝ったので私はあなたに投票しました。 – l15a

4

子エンティティのロードについての記事会談Using DbContext in EF 4.1 Part 6: Loading Related Entities

熱心に読み込む関連エンティティが

// 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();