2009-12-16 4 views
1

Рассмотрим следующий пример:Когда я могу избавиться от своего DataContext?

MyDataContext context = new MyDataContext(); // DB connection established. 
MyTableRecord myEntity = myDataContext.Table.FindEntity(12345); // retrieve entity 

Скажи мое лицо имеет отношения с другими таблицами, которые я хотел бы получить доступ через

foreach (var record in MyEntity.RelatedTable)

мне нужно держать мой DataContext в живых после того, как 2-й линии в порядке ли для доступа к свойствам объектов или же он достаточно безопасен для утилизации?

Я понимаю, что Linq to SQL использует отложенное выполнение, поэтому мне интересно, использует ли оно только отложенное выполнение, когда вы изначально извлекаете объект или используете ли он это при обращении к связанным записям таблицы.

Пример

var userRepo = new UserRepository(); // creates new DataContext 
var auditRepo = new AuditRepository(); // creates new DataContext 
var activeUsers = userRepo.FindActiveUsers(); 
foreach (var user in activeUsers) 
{ 
    // do something with the user 
    var audit = new Audit(); 
    audit.Date = DateTime.Now; 
    audit.UserID = user.ID; 
    auditRepo.Insert(audit); 
} 

Мой метод вставки в моем репо вызывает SubmitChanges. Таким образом, это приемлемо, или это пустая трата связи. Должен ли я реально делать:

var userRepo = new UserRepository(); 
var activeUsers = userRepo.FindActiveUsers(); 
foreach (var user in activeUsers) 
{ 
    // do something with user 
    var audit = new Audit(); 
    audit.Date = DateTime.Now; 
    audit.UserID = user.ID; 
    user.Audits.Add(audit); 
    userRepo.Save(); 
} 

Чтобы повторно использовать уже открытый DataContext? Что бы вы делали в ситуациях, когда вы открывали высокоуровневый файл данных, а затем приходилось выполнять некоторый уровень обработки, должен ли я пропускать userRepo или я должен создать отдельный репозиторий?

ответ

4

Чтобы получить доступ к полям в других таблицах, вам необходимо сохранить DataContext в живых. Кроме того, не вызывайте dispose напрямую, используйте ключевое слово using.

using (MyDataContext context = new MyDataContext()) // DB connection established. 
{ 
    MyTableRecord myEntity = myDataContext.Table.FindEntity(12345); // retrieve entity 

    foreach (var record in MyEntity.RelatedTable) 
    { 
     ... 
    } 
} 
+0

Всегда ли рекомендуется использовать инструкцию using при обращении к репозиториям? Я создал пользовательские репозитории, которые я использую, и иногда это не кажется хорошей идеей для переноса всего моего кода на использование операторов. – James

+1

Вы имеете в виду, что у вас есть собственный код, на котором вы работаете, и вы можете гарантировать, что он не удерживайте на любых ресурсах дольше, чем необходимо, если вы опустите вызов Dispose и никогда не будете делать в будущем? Тогда в вашей ситуации, я думаю, это нормально, чтобы не звонить с использованием.Но в целом рекомендуется использовать вызов на любом объекте, который реализует IDisposable. Вы не будете пропускать что-либо, если вы этого не сделаете: сборщик мусора очистит неразмещенные объекты, выходящие за рамки. Но вы не знаете, когда будет запущен сборщик мусора, если вообще когда-либо. –

+1

Да, хороший момент. Марк, спасибо. – James

3

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

+0

Таким образом, L2S также использует отложенное выполнение при доступе к связанным объектам? – James

+0

Да, он использует отложенное выполнение, если вы не используете метод DataContext.LoadWith – tt83

+0

Спасибо за отзыв! Никогда не осознавал, что этот вариант доступен – James

Смежные вопросы