10

エンティティ フレームワーク コンテキストを宣言する際のベスト プラクティスはどれですか

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

    //Entity code

    return ;
}

また

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

EntityFrameWork で using を使用する必要がありますか? はいの場合、私の2番目の質問

DataAccess Layer で EF を実行し、結果を内部の IEnumerable に格納します。

マイDL

function()
{
    IEnumerable something = null;
    using(DBContext context = new DBContext())
    {
        IEnumerable something = ....
    }
    return something;
}

コントローラー内

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

そして、私のコントローラーでは、検索操作を行う必要があるため、これをリストとして取得しています

"The operation cannot be completed because the DbContext has been disposed Entity Framework"

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

IEnumerable を使用する場合、これをどのように処理しますか?

4

3 に答える 3

8

コンテキストが破棄される前に (つまり、ブロック内で)を呼び出すことにより.ToList()、EF の遅延読み込み動作を回避できます。IEnumerableusing

于 2013-04-17T11:26:31.703 に答える
6

はい、コンテキストをクリーンアップするため、使用はベスト プラクティスです。Using ステートメントは、次のショートカットです。

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

コンテキストは IEnumerables を返す可能性が高く、EF は遅延読み込みをサポートしているため、これらのオブジェクトは具体的なコレクション (つまり、yourResult.ToList()) にフェッチするまで読み込まれないことに注意してください。

このシナリオでは、よくある否定的な結果が発生します。

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

于 2013-04-17T12:25:56.300 に答える
3

Your request will be executed toward the datasource as soon as you'll call .ToList() method.

That's why you cannot perform .ToList() in your Controller as your context as been disposed at the end of the using block.

In your DL method, just do something like:

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

and in your Controller you'll get an IEnumerable of Something:

var mySomethingIEnumerable = DL.Function();

Hope that helps!

于 2013-04-17T11:50:02.920 に答える