Примечание: следующий совет применим для всех инструментов O / RM, которые реализуют шаблон единиц работы, таких как Entity Framework ObjectContext
, DbContext
, NHibernate Session
и LINQ to SQL DataContext
.
LINQ to SQL DataContext НЕ является поточно-ориентированным.Вы должны создать (как минимум) 1 контекст для каждого веб-запроса.Повторное использование одного и того же экземпляра в нескольких потоках означает, что один поток может вызвать SubmitChanges
, в то время как другой поток все еще вставляет новые объекты.Если вам повезет, DataContext
сгенерирует исключение, потому что оно не может сохранить изменения.Если вам не повезло, DataContext
завершается успешно, и вы нарушаете атомизацию одного запроса, что может привести к тому, что в вашей базе данных появятся противоречивые данные.Другими словами: у вас будет полная дерьмо база данных!
Кроме того, DataContext
хранит все объекты в своем кэше, что означает, что потребление памяти вашим приложением будет расти, что может привести кдо OutOfMemoryException
(OOM).И даже если вы не получите OOM, объекты в кэше устареют, особенно если другие приложения или процессы обновляют вашу базу данных, вы никогда не увидите эти изменения, когда объект уже находится в памяти.И последнее, что следует отметить, это то, что вы не можете откатить изменения, сделанные в DataContext
, поэтому, когда вы (в какой-то момент) аннулировали DataContext
(из-за ошибок), нет способа восстановить это (кромесоздание совершенно нового DataContext
).В этом случае ваш AppDomain обречен.