2009-10-15 2 views
0

я не нашел что-то подобное, так что я должен спросить:LINQ не распознает изменения в базе данных

Я использую LINQ к SQL, и все было хорошо, пока я не начал использовать хранимые процедуры для обновления записей базы данных. (My Stored Proc - это что-то вроде обновления всех записей, для которых groupid x) Обновление работает нормально, а значения в базе данных меняются. Но DataContext игнорирует эти изменения.

Должен сказать, что контекст данных - это синглтон, который, как я знаю, не является обычным способом, но у меня разные причины, почему я должен это делать.

так

db.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues); 

не помогает.

Почему он не знает об изменениях в db?

ответ

2

То, что вы пытаетесь сделать, очень сильно противоречит тому, как работает LinqToSql.

Использование долговечного DataContext очень сложно сделать правильно, особенно если вам нужно вызвать хранимые процедуры, где LinqToSql не может легко отслеживать изменения данных.

Изменения, внесенные в DataContext, обычно отслеживаются автоматически, поэтому DataContext может правильно управлять своим кешем и отслеживать изменения, внесенные в базу данных из этого DataContext. Однако это не всегда так. DataContext не (и не может легко) понять, что делает ваша хранимая процедура, поэтому он не знает, как правильно сохранить кеш. В этот момент, после вызова хранимой процедуры, ваш самый лучший вариант - избавиться от этого DataContext и создать новый. Это эффективно сдувает ваш кеш, который может или не может быть значительным поражением производительности, но целостность данных должна быть вашей главной задачей.

Если ваш Singleton DataContext не является единственной модификацией базы данных (например, ваша база данных может быть изменена такими типами: триггеры, пакетная обработка, другие приложения и т. Д.), Ваш DataContext может также содержать неточные данные в его кеш, который является еще одной причиной для краткосрочного DataContext.

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

Вы должны решить: насколько важна целостность данных?

+0

awsome ответ! благодаря – Markus

2

Поскольку datacontext кэширует значения. Вот статья о том, как clear the cache. Но теперь у вас возникла проблема внедрения системы уведомлений о том, когда нужно ее очистить.

Корпорация Майкрософт рекомендует использовать контекст данных только для одной единицы работы. Висящий на нем как однотонный , вероятно, - это не очень хорошая идея.

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