实体框架数据在具有中央数据库的多用户环境中更新

时间:2012-07-24 09:30:28

标签: c# entity-framework multi-user

让我解释一下这个标题。

我在应用程序(TestApp)中使用Entity Framework Code First。 出于调试目的, TestApp 连接到SQLExpress数据库(中央数据库服务器)。

为了简单起见,数据库包含一个表“Products”,TestApp在数据网格中显示数据库中的所有“产品”,TestApp可以添加/删除“产品”或修改ProductName。

public class Product {
 public int ProductId { get; set; }
 public string ProductName { get; set; }
}

public DbSet<Product> Products { get; set; }

我有3台PC安装并运行TestApp(我称之为Client_X)。如果我通过Client_1添加新的“产品”,则不会在Client_2和Client_3上的TestApp中直接显示。仅当Client_2和Client_3再次获取所有数据(手动刷新)时,才会看到新添加的记录。

我想知道的是什么: 如何通过EF Code First了解数据库中的更改? Client_2和Client_3如何自动更新其数据网格,因为添加或删除了新项目?

我不确定它是否被要求太多,但是一个简单的示例项目或简单的代码来证明这将是有用的。

供参考: 我是EF Code First的新手。 (我使用的是.NET 4.0和EF Code First 4.3.1)

提前致谢。

方案:

Client_3<
         \
          \
           \
            \
             \>
Client_1 <---> [Central Database] <----> Client_2

更新/编辑:

好的,很明显,实体框架本身不会在多个客户端之间进行任何同步。

所以我会问另一个问题: 我正在考虑使用Client-Server方式:

  • 创建数据库并使用的单个服务器应用程序 首先是实体框架代码。
  • 与该单个服务器通信的多个客户端 应用

    现在最好的方法是确保客户使用相同的数据并查看每个人的更新/更改? (我希望代码示例。)

2 个答案:

答案 0 :(得分:6)

您无法使用实体框架通知客户端。您可以为SaveChanges编写重载,或者创建扩展方法,但是如果您没有客户端 - >服务器架构,我无法想象您如何实现这一点。

如果您使用WCF作为数据库的网关,则可以在客户端和服务器之间创建双工通信,并且当新记录可用时,将使用回调通道通知客户端。

另一种方法是使用MS SQL Service Broker Overview (Service Broker)

尽管如此,有许多不同的方法可以获得理想的结果,但它们都不是实体框架,因为它是ORM,也不是应用程序框架或使用.NET构建的应用程序的通信框架。

答案 1 :(得分:2)

这不是EF的责任,更多的是您的一般应用程序设计。相对简单的背景或定期轮询过程可以解决您的问题。

在处理多个用户时需要考虑更多因素,例如记录锁定,如果您遇到特定问题,可能需要对这方面做一些研究,然后再回来。