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

标签 c# entity-framework

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

我的前端是一个 WPF 应用程序,它从 SqlExpress Server 检索所有数据。我正在使用最新的 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 查询?

感谢您的帮助!

最佳答案

我在几年前使用 Service Broker 解决了这个问题。我对这个问题做了一些研究,了解现在如何解决这个问题,似乎是用同样的方式完成的。在 GitHub 上搜索,我发现以下项目应该适合您的需求: monitor-table-change-with-sqltabledependency

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

关于c# - 将 DbContext 与数据库中的更改同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53411803/

相关文章:

entity-framework - 自动迁移与代码库迁移

c# - 将 IHttpContextAccessor 注入(inject) ApplicationDbContext ASP.NET Core 1.0

c# - EF6 代码优先迁移中的架构名称重复

C#:你能检测出当前执行上下文是否在 `lock (this)` 内吗?

c# - 什么时候 Control.Visible = true 变成了 false?

c# - C# WPF 中奇怪的换行行为

c# - 如何使用 Entity Framework 4.x 动态选择表?

c# - 为什么 Enumerable.Range 实现 IDisposable?

c# - 局部变量 C#

c# - Entity Framework 6 : The server was not found or was not accessible