1


0

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

私の好奇心は、私が using`部分のコメントを外すと context`エラーが発生するという事実から生じています。

どうして? 私はどうやら using`と context’s`を完全には理解していません。 そして、私はこれをもっと理解したいと思います。

GuidのworkerID = new Guid(新しいConnectDAL.DAL.Security()。GetUserIDByUserLogin(HUD.CurrentUser));

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


内部静的CmoDataContext context = new CmoDataContext();

public static DataTable GetAllMembers(){DataTable dataTable;

// using(context)// {var AllEnrollees = context.tblCMOEnrollmentsからの登録から新規選択{enrollment.ADRCReferralID、enrollment.CClientID、enrollment.CMONurseID、enrollment.CMOSocialWorkerID、enrollment.DisenrollmentDate、enrollment.DisenrollmentReasonerScrollProtect) 。登録日                                        };

dataTable = AllEnrollees.CopyLinqToDataTable(); // dataTableを返します。 }

3 Answer


6


"using"ブロックは、使用しているオブジェクトを自動的に破棄します。 正確なエラーについては詳しく説明しませんでしたが、 "using"があなたの "context"を処分するという事実に関係していると私は賭けています。

データコンテキストはアトミックに使用する必要があります。 それらはすでにそのように効率的になるように内部的にコーディングされています。 ほとんどのサンプルで "using"を使用しているのは、データコンテキストがusingの直前(またはその中)で初期化されているため、破棄されたコンテキストを参照しないためです。

最後の注意として、オブジェクトを破棄すると、オブジェクトはすべての内部メモリ参照(オープン接続、キャッシュデータなど)を解放します。

//Our context exists right now ... unless we've already called this method since the app started ;)
var myMembers = BLLCmo.GetAllMembers(worker ID); //(myMembers.Rows.Count!= 0){dgvMyMembers.DataSource = myMembers; //コンテキストは、この呼び出しの最後に配置されます。 //問題ありません。再度関数を呼び出しませんでした} else {var allMembers = BLLCmo.GetAllMembers();} //おっと、私たちのコンテキストは以前に破棄されましたdgvMyMembers.DataSource = allMembers; }


2


using`を使うと、コンテキストが GetAllMembers() `によって2度目に呼び出されたときに*破棄*されるのでエラーになります。

あなたが私が推薦するコンテキストを処分する必要があるならば、あなたは静的なコンテキストを持つこととは対照的にGetAllMembers()の中で1つをその場で作成します。

http://msdn.microsoft.com/en-us/library/system.idisposable.aspx[`IDisposable`]およびhttp://msdn.microsoft.com/en-us/library/yh598w02のドキュメントを調べてください。 aspx [`using`]。

これは Lifetime Management of DataContextであなたを助けるかもしれない記事へのリンクです。


2


私はこの問題を抱えていたし、その時も理解していませんでした。 私はちょうど使用を削除し、それがうまくいった。 問題は遅延読み込みでした。 DataContextは私に実体を与えました、しかし後で私は(外部キーの意味で)親実体の特性にアクセスしようとしました。 この親エンティティは最初にロードされなかったため、取得しようとしましたが、DataContextは削除されました。 そこで私はDataLoadOptionsを使いました。 関連エンティティが必要なことがわかっていた場合は、元のエンティティをロードしました。

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

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