私はMY`Using`と `DataContext`を理解するのに役立ち
-
16-09-2019 - |
質問
誰かが私に以下を説明していただけます。最初は、私はメソッドを呼び出すと、第2ビットがLINQのメソッドである方法です。
私の好奇心は、I 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;
}
解決
「使用」のブロックは自動的にあなたが使用しているオブジェクトを処分します。あなたは正確なエラーが何であるかについての詳細を与えていなかったので、私は「使って」あなたの「コンテキスト」を処分するという事実にそれが関連する賭けているし、後でもう一度、あなたのコンテキストを使用しようとするでしょう。
データコンテキストは、アトミックに使用すべきです。彼らは既に内部のように、長時間実行あなたがそうであるように1を持っている何の正当な理由は、通常はありません、そのように効率的にコーディングされています。あなたは、彼らが使用して(またはその中)の直前に初期化されたデータコンテキストを持っているし、その後、参照配置されたコンテキストにしようとしていないためである。
「を使って」を使用するほとんどのサンプルを参照してください理由最後の注意点として、オブジェクトを処分すること(例えばなどのオープンな接続、キャッシュされたデータ、など)すべての内部メモリ参照を解放するためにそれらを引き起こします。
//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;
}
他のヒント
using
を使用している場合、コンテキストが のそれはGetAllMembers()
で呼ばれています二度目に配置されているのでます。 あなたはエラーを取得します あなたはコンテキストを配置する必要がある場合は、
私はあなたがフライの上で1 のを作成sugest GetAllMembersで()静的コンテキストを有するのとは対照的に。
IDisposable
と using
でます。
ここのDataContextの寿命管理のお手伝いをするかもしれない記事へのリンクですのます。
私はこの問題を抱えていて、その時点でどちらかを理解していませんでした。私は使用して除去され、それが働きました。問題は、遅延ロードしました。 DataContextのは、私に実体を与えたが、その後、私は(外部キーの意味での)親エンティティのプロパティにアクセスしようとしました。この親エンティティが最初にロードされていなかったので、それを取得しようとしましたが、DataContextのは消えていました。だから私はDataLoadOptionsを使用しました。私は、関連するエンティティを必要と知っていたら、私は元のエンティティでそれをロードします。
例:あなたはあなたのDataContextに請求書を求めるが、後であなたがinvoice.Client.Nameのように、クライアントの名前にアクセスしたいです。クライアントがロードされていないので、名前は使用できません。
DataLoadOptionsを使用すると、ループの中で、この関連するエンティティが必要な場合は、子(または親)エンティティを事前にロードしていない場合、あなたが戻ってDBにあなたのループのように何回も行くよ、パフォーマンスのためにも重要です。