Quickie мысли (я сидел на встрече, так плохо мне)
Для ASP.NET, максимальное время жизни контекста данных является один пост или постбэк. Вы можете создать больше, чем это, но они все умрут при разгрузке страницы. Да, вы должны распоряжаться ими явно; что используя оператор не лучший способ справиться с этим, потому что она автоматически выбрасывайте, когда блок заканчивается:
using (NorthwindModel nw = new NorthwindModel())
{
do stuff
}
данных, который вернулся из запроса LINQ не исчезает с контекстом данных, но на тот момент это уже не связанные с контекстом, и изменения не могут быть использованы для обновления базы данных. (Вы всегда можете создать новый контекст, затем добавить новый объект или повторно запросить и слить изменения или что-то, что соответствует вашим потребностям.)
Знайте, что запрос LINQ не выполняется, пока не потребуется оценить данные. Это очень простая ошибка для хранения запроса, когда контекст данных удаляется, а затем, когда запрос должен выполняться, он не может, поскольку он был создан с использованием контекста данных, который больше не существует. Есть два общих способа справиться с этим.
- Обработать результаты запроса внутри блока использования контекста данных.
Force запрос выполнить, как правило, с .ToList() или каким-либо другим способом, который будет генерировать набор данных:
Список myCustomers = (от с в nw.Customers выберите с).К списку();
Выполняет запрос, копирует данные в перечислимую коллекцию и предоставляет коллекцию, которая может быть возвращена вызывающему методу. Однако эти объекты теперь отделены от контекста, поэтому они не могут использоваться для обновлений.
Если вы выполняете CRUD с LINQ, рекомендуется использовать один контекст данных для всех обновлений, удалений и вставок, а затем вызвать SubmitChanges() один раз для всех изменений. Это гарантирует, что они выполняются как одна транзакция. (Контекст данных будет генерировать транзакцию для каждого вызова SubmitChanges, если транзакция уже не запущена.)
Если вы хотите выбрать один элемент в запросе, используйте FirstOrDefault(), а не First(). First() будет выбрасывать и исключать, если ничто не соответствует критериям выбора, а FirstOrDefault() возвращает null. Очень полезно знать.
Помимо этого, получайте удовольствие и попробуйте множество вещей. LINQ изменит то, как вы думаете о данных.