Функции LINQ и удаление DataContext, отложенное выполнение - PullRequest
2 голосов
/ 04 февраля 2012

Так что мне нужен совет и понимание здесь. Заранее спасибо за ваши мысли.

Я разработал статические функции, которые возвращают одну запись из сущности 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 исчезнет к этому моменту? Любой совет?

1 Ответ

2 голосов
/ 04 февраля 2012

В принципе вам не нужно утилизировать () ваш DataContext по причинам, рассмотренным здесь:

Когда мне следует утилизировать контекст данных

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

Основной причиной реализации IDisposable для типа является избавление от любых неуправляемых ресурсов.Единственный неуправляемый ресурс, выделенный DataContext, - это базовое соединение с базой данных, но DataContext уже позаботится об открытии и закрытии соединения по мере необходимости.

Главное, чего вы хотите избежать, это вернуть коллекцию IEnumerable, а затем никогдаперечисляя его, так как это приведет к тому, что соединение останется открытым бесконечно долго.Однако, поскольку вы возвращаете только один объект, вам не нужно беспокоиться об этом.

Также обратите внимание, что если получить доступ к какому-либо свойству отношений в возвращенном объекте, это может вызвать мгновенное открытие соединения, так что свойство может быть загружено с отложенным доступом.Вы можете избежать этого, используя DataLoadOptions.LoadWith () с вашим DataContext, чтобы загружать любые свойства, к которым вы хотите получить доступ.См. http://msdn.microsoft.com/en-us/library/system.data.linq.dataloadoptions.aspx

Что касается последней части вопроса, если возвращаемые сущности содержат свойства, которые могут быть загружены с отложенной загрузкой, то они будут содержать внутренние ссылки для поддержки DataContext, который будет хранить его в памяти.Если у вас больше нет ссылок на эти объекты, DataContext, конечно, будет собираться мусором, как и любой другой объект.

...