急ごしらえの考え(私は会議に座っているので、私は悪いです)
ASP.NET の場合、データ コンテキストの最大有効期間は 1 回のポストまたはポストバックです。それ以上作成することもできますが、それらはすべてページのアンロードで消滅します。はい、明示的に破棄する必要があります。ブロックが終了すると自動的に dispose が呼び出されるため、using ステートメントはこれを処理するための最良の方法です。
using (NorthwindModel nw = new NorthwindModel())
{
do stuff
}
LINQ クエリから返されたデータは、データ コンテキストと共に消えませんが、その時点でコンテキストに接続されなくなり、変更を使用してデータベースを更新することはできなくなります。(いつでも新しいコンテキストを作成してから、新しいオブジェクトとしてアタッチしたり、変更を再クエリしてマージしたり、必要に応じて何でもできます。)
LINQ クエリは、データの評価が必要になるまで実行されないことに注意してください。データ コンテキストが破棄されている間、クエリを保持するのは非常に簡単な間違いです。その後、クエリを実行する必要があるときに実行できません。これは、存在しないデータ コンテキストで作成されたためです。これに対処するには、2 つの一般的な方法があります。
- データ コンテキストの using ブロック内でクエリ結果を処理します。
通常は .ToList() またはデータのコレクションを生成するその他のメソッドを使用して、クエリを強制的に実行します。
List myCustomers = (nw.Customers の c から c).ToList(); を選択します。
これにより、クエリが実行され、データが列挙可能なコレクションにコピーされ、メソッドの呼び出し元に返すことができるコレクションが提供されます。ただし、これらのオブジェクトは現在コンテキストから分離されているため、更新には使用できません。
LINQ で CRUD を実行している場合は、すべての更新、削除、および挿入に対して 1 つのデータ コンテキストを使用し、すべての変更に対して一度 SubmitChanges() を呼び出すことをお勧めします。これにより、それらが単一のトランザクションとして実行されることが保証されます。(トランザクションがまだ実行されていない場合、データ コンテキストは SubmitChanges 呼び出しごとにトランザクションを生成します。)
クエリで 1 つの項目を選択する場合は、First() ではなく FirstOrDefault() を使用します。First() は、選択基準を満たすものがない場合に例外をスローし、FirstOrDefault() は null を返します。知っておくと非常に便利です。
その上で、楽しんで、たくさんのことに挑戦してください。LINQ は、データに対する考え方を変えます。