1

誰かが私に以下を説明してください。1 つ目はメソッドの呼び出し方法で、2 つ目は LINQ メソッドです。

私の好奇心は、その部分 contextのコメントを外すとエラーが発生するという事実に由来しています。using

なんで?using私はどうやら完全には理解していないようcontext'sです。そして、私はこれをよりよく理解したいと思います。

Guid workerID = new Guid(new ConnectDAL.DAL.Security().GetUserIDByUserLogin(HUD.CurrentUser));

        var myMembers = BLLCmo.GetAllMembers(workerID);
        if (myMembers.Rows.Count != 0)
        {
            dgvMyMembers.DataSource = myMembers;
        }
        else
        {
            var allMembers = BLLCmo.GetAllMembers();
            dgvMyMembers.DataSource = allMembers;
        }




    internal static CmoDataContext context = new CmoDataContext();

    public static DataTable GetAllMembers()
    {
        DataTable dataTable;

        //using (context)
        //{
            var AllEnrollees = from enrollment in context.tblCMOEnrollments
                               select new
                                       {
                                           enrollment.ADRCReferralID,
                                           enrollment.ClientID,
                                           enrollment.CMONurseID,
                                           enrollment.CMOSocialWorkerID,
                                           enrollment.DisenrollmentDate,
                                           enrollment.DisenrollmentReasonID,
                                           enrollment.EconomicSupportWorkerID,
                                           enrollment.EnrollmentDate
                                       };

            dataTable = AllEnrollees.CopyLinqToDataTable();
        //}
        return dataTable;
    }
4

3 に答える 3

6

"using" ブロックは、使用しているオブジェクトを自動的に破棄します。正確なエラーが何であるかについての詳細を提供しなかったので、「使用」が「コンテキスト」を破棄し、後でコンテキストを再度使用しようとするという事実に関連していると思います。

データ コンテキストはアトミックに使用する必要があります。それらはすでにそのように効率的になるように内部的にコーディングされています。通常、あなたのように長時間実行する正当な理由はありません。「using」を使用するほとんどのサンプルが表示される理由は、using の直前 (またはその中で) のデータ コンテキストが初期化されており、破棄されたコンテキストを参照しようとしないためです。

最後に、オブジェクトを破棄すると、内部メモリ参照 (開いている接続、キャッシュされたデータなど) がすべて解放されます。

//Our context exists right now ... unless we've already called this method since the app started ;)
var myMembers = BLLCmo.GetAllMembers(workerID); // Context is disposed at the end of this call
if (myMembers.Rows.Count != 0)
{
  dgvMyMembers.DataSource = myMembers;  //No prob, we didn't call our function again
}
else
{
  var allMembers = BLLCmo.GetAllMembers();  // Oops, our context was disposed of earlier
  dgvMyMembers.DataSource = allMembers;
}
于 2009-09-25T13:38:20.753 に答える
2

usingを使用すると、コンテキストがによって 2 回目に呼び出されたときに破棄されるため、エラーが発生しますGetAllMembers()

コンテキストを破棄する必要がある場合は、静的コンテキストを使用するのではなく、GetAllMembers() でその場で作成することをお勧めします。

IDisposableおよびのドキュメントを参照してくださいusing

DataContext のライフタイム管理に役立つ記事へのリンクを次に示します。

于 2009-09-25T13:46:54.410 に答える
2

私はこの問題を抱えていて、その時も理解していませんでした。using を削除したところ、機能しました。問題は遅延読み込みでした。DataContext はエンティティを提供しましたが、後で (外部キーの意味で) 親エンティティのプロパティにアクセスしようとしました。この親エンティティは最初に読み込まれなかったため、取得しようとしましたが、DataContext がなくなりました。そこで、DataLoadOptions を使用しました。関連エンティティが必要であることがわかっている場合は、元のエンティティをロードしました。

例: datacontext への請求書を要求した後、invoice.Client.Name のようにクライアントの名前にアクセスしたいとします。クライアントがロードされていないため、名前は使用できません。

DataLoadOptions もパフォーマンスにとって重要です。ループでこの関連エンティティが必要な場合、子 (または親) エンティティをプリロードしないと、ループする回数だけ DB に戻ります。

于 2009-10-01T02:10:07.800 に答える