2

ですから、ここでアドバイスと洞察が必要です。ご意見ありがとうございます。

LINQ エンティティから単一のレコードを返す静的関数を開発しました。そのようです:

FooRecord GetRecord(Guid id)
{
   using(var dc = new FooDataContext())
       return dc.FooRecords.Where(a => a.Id == id).First();
}

DataContext が既に破棄されているため、これにより例外がスローされ、遅延実行で問題が発生します。これは機能します:

FooRecord GetRecord(Guid id)
{
       var dc = new FooDataContext();
       return dc.FooRecords.Where(a => a.Id == id).First();
}

私が心配しています。DataContext はどのくらいの速さで破棄されますか? 明らかに、レコードをすぐに取得しても問題は発生しません。ただし、関連付けを通じてレコードを取得する必要があるとします。

var record = Data.FooRecord.GetRecord(id);
//Do a bunch of stuff...
//Now we grab the related record from another entity
var barRecord = record.BarRecord

この時点で DataContext がなくなるリスクはありますか? 何かアドバイス?

4

1 に答える 1

2

ここで説明する理由により、基本的に DataContext を Dispose() する必要はありません。

データ コンテキストを破棄する必要がある場合

http://csharpindepth.com/ViewNote.aspx?NoteID=89

型に IDisposable を実装する主な理由は、アンマネージ リソースを破棄することです。DataContext によって割り当てられる唯一のアンマネージド リソースは基になるデータベース接続ですが、DataContext は必要に応じて接続の開閉を既に処理しています。

回避したい主なことは、IEnumerable コレクションを返し、それを決して列挙しないことです。これにより、接続が無期限に開いたままになります。ただし、返されるオブジェクトは 1 つだけなので、これについて心配する必要はありません。

また、返されたオブジェクトのリレーションシップ プロパティにアクセスすると、プロパティを遅延ロードできるように、接続が一時的に再度開かれる可能性があることにも注意してください。これを回避するには、DataLoadOptions.LoadWith() を DataContext で使用して、アクセスする予定のプロパティを熱心に読み込みます。http://msdn.microsoft.com/en-us/library/system.data.linq.dataloadoptions.aspxを参照してください。

質問の最後の部分に関しては、返されたエンティティに遅延ロードできるプロパティが含まれている場合、メモリに保持する DataContext をバックアップするための内部参照が含まれます。これらのエンティティへの参照がなくなると、当然、DataContext は他のオブジェクトと同様にガベージ コレクションされます。

于 2012-02-04T15:40:09.973 に答える