2

私は新しいasp.netプログラマーで、この質問をしたところ、より一般的な質問が残りました。

Linq とデータ オブジェクトに関する現在のベスト プラクティスは何ですか? 具体的にいつするか。暗く、新しく、それらを処分してください。

また、ユーザー データ オブジェクトなど、同じページのさまざまなスコープで使用されるオブジェクトについても同様です。それらはモジュール レベルにする必要がありますか、それとも各スコープで作成する必要がありますか?

誰かが、現在のベスト プラクティスに関するクリフ ノート、またはそれらを説明する記事へのリンクを提供してくれれば、非常にありがたいです。

4

2 に答える 2

2

急ごしらえの考え(私は会議に座っているので、私は悪いです)

ASP.NET の場合、データ コンテキストの最大有効期間は 1 回のポストまたはポストバックです。それ以上作成することもできますが、それらはすべてページのアンロードで消滅します。はい、明示的に破棄する必要があります。ブロックが終了すると自動的に dispose が呼び出されるため、using ステートメントはこれを処理するための最良の方法です。

using (NorthwindModel nw = new NorthwindModel())
{
    do stuff
}

LINQ クエリから返されたデータは、データ コンテキストと共に消えませんが、その時点でコンテキストに接続されなくなり、変更を使用してデータベースを更新することはできなくなります。(いつでも新しいコンテキストを作成してから、新しいオブジェクトとしてアタッチしたり、変更を再クエリしてマージしたり、必要に応じて何でもできます。)

LINQ クエリは、データの評価が必要になるまで実行されないことに注意してください。データ コンテキストが破棄されている間、クエリを保持するのは非常に簡単な間違いです。その後、クエリを実行する必要があるときに実行できません。これは、存在しないデータ コンテキストで作成されたためです。これに対処するには、2 つの一般的な方法があります。

  1. データ コンテキストの using ブロック内でクエリ結果を処理します。
  2. 通常は .ToList() またはデータのコレクションを生成するその他のメソッドを使用して、クエリを強制的に実行します。

    List myCustomers = (nw.Customers の c から c).ToList(); を選択します。

これにより、クエリが実行され、データが列挙可能なコレクションにコピーされ、メソッドの呼び出し元に返すことができるコレクションが提供されます。ただし、これらのオブジェクトは現在コンテキストから分離されているため、更新には使用できません。

LINQ で CRUD を実行している場合は、すべての更新、削除、および挿入に対して 1 つのデータ コンテキストを使用し、すべての変更に対して一度 SubmitChanges() を呼び出すことをお勧めします。これにより、それらが単一のトランザクションとして実行されることが保証されます。(トランザクションがまだ実行されていない場合、データ コンテキストは SubmitChanges 呼び出しごとにトランザクションを生成します。)

クエリで 1 つの項目を選択する場合は、First() ではなく FirstOrDefault() を使用します。First() は、選択基準を満たすものがない場合に例外をスローし、FirstOrDefault() は null を返します。知っておくと非常に便利です。

その上で、楽しんで、たくさんのことに挑戦してください。LINQ は、データに対する考え方を変えます。

于 2009-10-14T22:16:47.100 に答える
0

通常、操作対象のデータをパラメーターとして関数に渡し、型の依存関係をコンストラクターの引数として渡します。したがって、たとえば、linq データ コンテキストは、型が動作するために依存するものになる可能性が高いため、コンストラクターに注入する必要があります。コンテキストでデータを検索するために使用する値は急速に変化し、同じコンテキストで繰り返し使用されるため、型の関数パラメーターになります。

ただし、有効期間内に複数のコンテキストで操作を実行するように型が構築されている場合は、コンテキストを関数パラメーターとして渡すことを検討できますが、これはおそらく何よりも設計上の問題を示しています。

型の関数スコープ内でのデータ コンテキストのインスタンス化に関しては、型の有効期間が関数呼び出し自体の有効期間のみ持続することが保証されていない限り、実際には関数にそのオーバーヘッドが発生する理由はありません。現時点ではそうなっていても、将来はそうではないかもしれないので、その場合を念頭に置いて型を設計することをお勧めします。

于 2009-10-14T21:40:06.480 に答える