将DbContext与数据库中的更改同步

时间:2018-11-21 12:13:08

标签: c# entity-framework

我目前正在.NET 4.0中开发一个多用户数据管理系统。

我的前端是一个WPF应用程序,它从SqlExpress Server中检索所有数据。我使用最新的Entityframework版本作为主要数据层来读写数据库。

该软件必须处理以下情况。每个前端(WPF应用程序)都可以在客户端自己创建的数据库中添加和修改数据。不允许客户端修改/删除其他用户的记录,因此每个实体都在主实体上存储了用户名信息。

在这里您可以看到我正在使用的数据模型(EF代码优先方法)。

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 :(得分:2)

几年前,我使用Service Broker解决了这个问题。对于这个问题,我已经进行了一些研究,以解决目前的问题,并且似乎是通过相同的方式完成的。在GitHub上搜索时,我发现了以下适合您需求的项目: monitor-table-change-with-sqltabledependency

使用该库,您可以监听SqlTableDependency.Change事件,并在表中的条目被更新,插入,删除时收到通知。

相关问题