Синхронизировать DbContext с изменениями в базе данных - PullRequest
0 голосов
/ 21 ноября 2018

В настоящее время я занимаюсь разработкой многопользовательской системы управления данными в .NET 4.0.

Мой интерфейс представляет собой приложение WPF, которое получает все данные с сервера SqlExpress.Я использую последнюю версию Entityframework в качестве основного слоя данных для чтения и записи в базу данных.

Программное обеспечение должно обрабатывать следующий сценарий.Каждый интерфейс (приложение WPF) может добавлять и изменять данные в базе данных, которая создается самим клиентом.Клиенту не разрешено изменять / удалять записи от других пользователей, поэтому каждый объект хранит информацию об имени пользователя в основном объекте.

Здесь вы можете увидеть модель данных, которую я использую (EF Code First Approach).

enter image description here

Я использую этот запрос для загрузки всех данных во внешнее приложение:

public static Context GetDataContext()
{
    return new Context(Settings.ServerConnection);
}

public Project LoadProject(int id)
{
    Remoting.Context = GetDataContext();
    Project = Remoting.Context.dbsProjects.Where(p => p.Id == id)
.Include(p => p.Categories.Select(x => x.Templates.Select(y=>y.Properties.Select(xx=>xx.Binding))))                                                
.Include(p => p.Categories.Select(x => x.Templates.Select(y => y.Links)))
.Include(p => p.DataSources).FirstOrDefault();

            OnPropertyChanged("Project");
            return Project;
        }

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

Теперь я хочу синхронизировать мой DbContext, который является долгоживущим контекстом, для полного времени выполнения MainWindow.Означает, что когда другой веб-интерфейс вставляет данные обновлений, которые принадлежат ему, я хочу отображать их также во всех других клиентах.

Я нашел решение, как обновить все уже существующие сущности в одном контексте, поэтому я использую этостроки кода:

var refreshableObjects = Remoting.Context.ChangeTracker.Entries().Select(c => c.Entity).ToList();
    Remoting.Context.ObjectContext.Refresh(System.Data.Entity.Core.Objects.RefreshMode.StoreWins, refreshableObjects);

Я не уверен, что это правильное решение, но пока оно работает для меня.

Пока я могу обновить все уже загруженные объекты, но японятия не имею, как я могу обнаружить объекты, которые созданы или удалены другим интерфейсом, который работает в то же время.Существует ли какой-либо встроенный механизм для обновления исходного запроса linq, который загружает или удаляет новые объекты в базе данных?

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 27 ноября 2018

Я решил эту проблему несколько лет назад, используя Service Broker.Я провел небольшое исследование по этому вопросу о том, как это решается в настоящее время, и кажется, что это делается так же.Выполняя поиск в GitHub, я нашел следующий проект, который должен соответствовать вашим потребностям: monitor-table-change-with-sqltabledependency

Используя эту библиотеку, вы можете прослушать SqlTableDependency.Change -event и получитьуведомляется, когда записи в таблице обновляются, вставляются, удаляются. сильный текст

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