Данные через Linq - EntityFramework - соединение с базой данных SQL не «обновляется» - PullRequest
2 голосов
/ 19 декабря 2011

Возможные ссылки

Я обнаружил аналогичную проблему: Обновление соединения с базой данных SQL , которое не предлагает решение (больше для проверки кода)

и LINQ to SQL не обновляется при изменении данных в базе данных , что должно быть ближе к моей проблеме.

Настройка

Я разрешаю пользователю изменять строку подключения во время выполнения (через SqlConnectionStringBuilder, EntityConnectionStringBuilder и "New EntityClient.EntityConnection (entityconn ())") Я использую EntityConnection с .Open и с "New Database.DatabaseContainer (entityConnection)"

Я продолжаю использовать один и тот же контейнер для чтения данных из БД. и для вызова ".SaveChanges" и пока не явно использовать транзакции использования. (Я ожидал, что «SaveChanges» автоматически сделает коммит и сгенерирует исключения, если кэшированные данные изменились перед фиксацией)

Описание проблемы

Когда я выполняю 2 программы и изменяю данные одной программой, другая не замечает изменений, когда установила соединение до того, как другая программа зафиксировала.

Например, если у меня 2 раза одна и та же программа (A и B), происходит следующее: Начало A, начало B, изменение данных в A, B не может прочитать измененные данные (потому что он установил соединение до того, как A завершил изменения).

Вопрос

Как обновить локальные кэшированные данные и как бороться с гоночными проблемами?

Когда я обновляю соединение для A, а затем изменяю данные, но при этом B обновлялся и также начинал изменять данные, тогда B может перезаписать изменения из A, не заметив. Это происходит всякий раз, когда база данных изменяется после обновления. Второй вопрос, который я упомянул выше, похоже, не касается этой проблемы.

Мои угаданные идеи, как я могу решить проблему

Может быть, команда "Container.Refresh (Objects.RefreshMode.StoreWins, entity) может помочь с этим, но я не уверен, какой объект предоставить как сущность. Устаревший, который я только что прочитал из кэшированной базы данных? по-прежнему проблема, я не уверен, когда этот конфликт произойдет.

Может быть, что-то должно быть не так с транзакцией или изменением области транзакции, гарантируя, что все изменения будут сделаны (или неоднократно предприняты) до тех пор, пока в базе данных не было никаких изменений с момента запуска транзакции? Возможно ли это или как работать с данными, которые уже были изменены другой программой с активной транзакцией?

Ответы [ 2 ]

1 голос
/ 19 декабря 2011

То, что вы видите, это идентификационная карта поведение, и это основная особенность EF.

Для решения проблем с обновлением вы можете использовать

Обновить

objectContext.Refresh(RefreshMode.StoreWins, entity); 

entity - это объект, ранее извлеченный из базы данных, которую вы хотите обновить.

MergeOption

objectContext.YourEntitySet.MergeOption = MergeOption.OverwriteChanges;
var data = objectContext.YourEntitySet.
              /* Any query you want to execute to refresh your data */
              ToList();

MergeOption контролирует способ считывания данных на карту идентичности. Настройки по умолчанию - AppendOnly, при котором будут реализованы только те объекты, которые не были загружены ранее, но уже загруженные объекты останутся без изменений - это основная функция, поскольку в противном случае любой запрос сможет перезаписать ваше несохраненное состояние.

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

0 голосов
/ 19 декабря 2011

Я не уверен, поможет ли это вам в контексте EF, но взгляните на SqlDependency :

"SqlDependency позволяет получать уведомления, когда исходные данные в базе данных изменяются, чтобы можно было обновить кэш."

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...