Возможные ссылки
Я обнаружил аналогичную проблему: Обновление соединения с базой данных 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) может помочь с этим, но я не уверен, какой объект предоставить как сущность. Устаревший, который я только что прочитал из кэшированной базы данных? по-прежнему проблема, я не уверен, когда этот конфликт произойдет.
Может быть, что-то должно быть не так с транзакцией или изменением области транзакции, гарантируя, что все изменения будут сделаны (или неоднократно предприняты) до тех пор, пока в базе данных не было никаких изменений с момента запуска транзакции? Возможно ли это или как работать с данными, которые уже были изменены другой программой с активной транзакцией?