2013-04-17 3 views
7

を使用してEntity Frameworkのコンテキストを宣言Entity Frameworkのコンテキスト宣言のベストプラクティスがあるどの

function() 
{ 
    DBContext context = new DBContext(); 

    //Entity code 

    return ; 
} 

または

function() 
{ 
    using(DBContext context = new DBContext()) 
    { 
     //Entity code 
    } 
} 

我々はEntityFrameWorkで使用して使用する必要がありますか?そうならば、私の第二の質問

DATAACCESS層に

MY DL

function() 
{ 
    IEnumerable something = null; 
    using(DBContext context = new DBContext()) 
    { 
     IEnumerable something = .... 
    } 
    return something; 
} 
コントローラ

function() 
{ 
    List some = something.ToList(); 
} 

そして、私のコントローラの午前中を使って内部のEFを実行してIEnumerableに結果を格納しています私はいくつかの操作を行う必要があるとして、これをリストとして取得する

私はIEnumerableをして使用して使用する場合

はい、私はDLからのリストを返すことができ、それが正常に動作します

は、どのように私はこれを処理するのですか?

+1

を使用して、結果を結合することによってこの問題を回避することができますあなたは尋ねました:http://stackoverflow.com/questions/824330/should-entity-framework-context-be-put-into-using-statement?rq = 1 –

+0

はい私の2番目の質問を確認してください – user2067567

+0

[StatementとEntity Frameworkの使い方](http://stackoverflow.com/questions/13826536/using-statement-and-entity-framework) – Habib

答えて

7

コンテキストが配置される前に、あなたはあなたの要求はとすぐに電話するよとデータソースに向かって実行されます(つまり、あなたのusingブロック内)IEnumerable.ToList()を呼び出すことによって

+0

ありがとう@paul 。どのように私の2番目の質問。それは間違った方法ですか? – user2067567

+0

うん、まだポールが言ったように使ってください。 +1与えられます。モデルに孫のオブジェクトがある場合でも、同様の問題が発生します。私はまだそれを解決するために時間を費やしていません。 – James

+1

@James元のLinqステートメントの '.Include()'を使って子供や孫を手に入れることができると思います。 – paul

3

を遅延ロードのEFの挙動を回避することができます.ToList()メソッド。

これは、usingブロックの最後に配置されているコンテキストとして、コントローラの.ToList()を実行できないためです。あなたのDL方法で

は、単にような何か:

IEnumerable<Something> function() 
{ 
    using(DBContext context = new DBContext()) 
    { 
     return something.ToList(); 
    } 
} 

をし、あなたのコントローラであなたは何かのIEnumerableを取得します:

var mySomethingIEnumerable = DL.Function(); 

役立ちます希望を!

6

はい、あなたの状況を整理するので、usingはベストプラクティスです。覚えておいてください

try { 
    // Execute your code inside the using statement 
} 
finally { 
    // Cleanup the context no matter what by calling .Dispose() 
} 

、あなたのコンテキストがありそうIEnumerablesを返し、EFは遅延読み込みをサポートしていますので、あなたは具体的なコレクションにそれらを取得するまで、これらのオブジェクトが読み込まれることはありません(すなわちyourResult.ToList:Using statementはショートカットです。 ())。

共通否定的な結果がこの状況で発生し

:私はこのSOリンクが正確に何だと思います

public IEnumerable<Employee> GetEmployeesInAccounting() 
{ 
    using(var myContext = new MyDbContext()) 
    { 
     return myContext.Employees.Where(emp => emp.Department == 'Accounting'); 
    } 
} 

// Code that fails, Assuming Manager is a lazy loaded entity, this results in an exception but it compiles no problem 
var acctEmps = GetEmployeesInAccounting(); 
var something = acctEmps.First().Department.Manager.Department; 

あなたは.Include(emp => emp.Manager)(LINQの拡張メソッド)を使用して.ToList();

関連する問題