如何将Entity Framework用于具有多个客户端的应用程序

时间:2019-01-04 09:57:02

标签: c# mysql wpf entity-framework entity-framework-6

我创建了一个管理酒店,客房,预订和客户的应用程序。在第一个版本中,我使用纯MySQL命令与数据库进行通信,并且可以正常运行,但是很难实现,主要是在需要更改属性名称或数据库中的顺序以及复杂实体中的相对命令时,以及取得结果也很慢。因此,我尝试使用实体框架来实现它。 从那时起,我遇到了太多的问题,我想去解决。首先,我的应用程序被两个客户端使用,我需要同步数据。 EF正在缓存数据以获得更快的结果,即使它们在数据库中发生了变化。据我所知,EF不会检查数据是否为最新数据,而我为此找到的解决方案是:

  1. 重新加载或分离每个实体-在拥有300个房间或2000个客户的情况下,这很糟糕
  2. 处置并重新创建上下文-这是我尝试做的事情,但是似乎很难实现,因为我的应用程序可以同时具有3或4个窗口,然后我需要在每个组合框中重新加载ItemSource并以其他方式列出当我再次使用它时,会抛出异常,例如“已处理上下文”或“许多跟踪器跟踪实体更改”或“未公开外键”等。这样一来,您也会丢失更改跟踪器。

另一个大问题是,当我一段时间不使用我的应用程序,然后访问试图通过延迟加载获取实体的属性时,如果达到连接或命令超时,它可能会崩溃。也许可以通过异常处理来解决,但我认为EF可以管理这类事情。

问题是,我需要变更跟踪器来更新实体,我还使用MVVMlight和我在Internet上通过UnitOfWork找到的通用存储库。 https://cpratt.co/truly-generic-repository/

我的应用是WPF 4.7.2

有什么建议吗?是否应该使用其他框架与数据库通信?我应该使用其他类型的数据库吗?其他编程语言?

另一个

1 个答案:

答案 0 :(得分:1)

我知道您不会想听这个,但是这个问题没有“一刀切”的答案。人们致力于解决这类问题的整个职业生涯。

我在航空业工作,在全球范围内,我们实际上有成千上万的自助服务终端,终端,移动电话应用程序等都同时访问同一个数据库,尽管其中一些服务器位于后面,但其中许多仍需要实时通信最严密的防火墙...和最脆弱的机场网络...您将看到。作为一个非常粗略的指导,我倾向于通过Web服务器公开数据库,并通过它进行所有连接。对于实时的东西,我使用WebSockets(当网络不支持它时,可以通过长轮询来模拟),但是非关键的东西通常可以通过基本的REST调用来处理;这两种技术都具有足够的JavaScript支持,这对于何时(而不是是否)最终开发任何类型的Webapp组件很重要。一般来说,我会避免使用SOAP。如果您已经控制了沟通渠道的两端,那么除非有理由,否则没有必要增加额外的复杂性。

做这样的事情的好处是,您最终完成了一个包含所有项目共享的所有模型的项目,这反过来又带来了出色的类型安全性和代码重用。 .NET通常会自动为您处理组件之间的序列化,并且很容易让数据库层在真实环境中进行压力测试。您还拥有一个用于日志记录和报告生成的集中点,客户有时会希望该点(分析本身就是一个完整的领域)。不利的一面是,增加了专用服务器会增加额外的复杂性和潜在的故障点,如果您必须在本地托管它,则会增加安装过程的复杂性,也可能会增加客户端网络配置的复杂性。

这是一个答案,还有更多答案。一旦您开始遇到服务器加载和冗余之类的问题,一切都会变得非常“有趣” ...