Entity framework ORM中的跟踪数据如何保持最新?

Entity framework ORM中的跟踪数据如何保持最新?,entity-framework,orm,Entity Framework,Orm,当数据更改可能来自其他来源时,实体框架之类的东西如何跟踪对其数据的更改?例如:当有一个相同asp net核心应用程序的集群运行时,如果一个应用程序更新了一条记录,但它在另一个实例上被跟踪,并且该实例接收到get请求,它不会发送过期数据吗 基本上,如果ORMs执行本地更改跟踪,它们如何保持酸性?将EF上下文和它们的本地缓存视为短期缓存会有所帮助。当您阅读一个实体时,该实体的“寿命”应该被认为与创建它的DbContext的寿命相匹配。在该生命周期之外,该对象实际上只是被假定为与任何其他可能过时的数据

当数据更改可能来自其他来源时,实体框架之类的东西如何跟踪对其数据的更改?例如:当有一个相同asp net核心应用程序的集群运行时,如果一个应用程序更新了一条记录,但它在另一个实例上被跟踪,并且该实例接收到get请求,它不会发送过期数据吗


基本上,如果ORMs执行本地更改跟踪,它们如何保持酸性?

将EF上下文和它们的本地缓存视为短期缓存会有所帮助。当您阅读一个实体时,该实体的“寿命”应该被认为与创建它的DbContext的寿命相匹配。在该生命周期之外,该对象实际上只是被假定为与任何其他可能过时的数据副本一样。即使在该生命周期内,它也不会与底层数据源同步,因此关键是调用
SaveChanges
时。EF提供的缓存更多地围绕着这样的场景:“我将加载一些实体,这些实体引用其他实体。当代码在实体上迭代时,当它遇到对其他实体的引用时,EF将检查是否已经加载了其他实体,并在进入DB之前为其提供服务。”因此,从这个意义上说,长寿命的DbContext是一件坏事,因为其中一些缓存数据可能非常陈旧,并且随着DbContext加载更多数据,筛选这些跟踪实体的速度会变慢,并且上下文会消耗更多内存

在web应用程序中,DbContext的作用域通常是单个请求,或者比单个请求短。(工作单元)这意味着对并发处理的请求所做的编辑不会通知彼此的更改,并且在这些请求上下文加载其数据并准备保存期间,两个请求都不会看到其他源所做的更改。EF可以知道检查并发更改的内容,通常是行版本时间戳,并且可以在检查失败时阻止更新。除此之外,开发人员还必须决定采取什么行动。这通常意味着捕获并发错误,然后交给适当的处理程序记录详细信息并通知用户。这可能是wins中的第一个场景,用户收到通知,他们的更改失败并重试;(提供刷新后的数据)wins场景中的最后一个场景,提示用户有更改,但可以覆盖;(希望在出现争议/问题时记录事件)或合并,系统检查更改并提供任何冲突和更改的详细信息,供用户查看和调整/接受/或取消更新

EF可以帮助检测到这一点,但最终开发人员必须编码如何处理它


就在并发编辑发生时检测而言,这需要有意识的编码来做一些事情,比如在会话(发布/订阅)之间通信更改,其中每个会话侦听它正在积极处理的实体的更新,并在更新实体时向实体广播更改。检测其他来源可能对数据进行的其他更改意味着另一个进程监听数据库更新(系统已经知道的更改除外),并向任何活动会话广播这些更改通知。当然,这是一件非常酷的事情,但它所带来的成本和复杂性必须是合理的,不仅仅是在save上处理并发问题。:)

简单(也是唯一)的答案是:不是。EF不会以任何方式跟踪来自其他来源的更改。这个地区没有任何东西是自动化的。嗯。。。在这种情况下,我看不到在我的项目中使用完整ORM(如EF)的任何理由。在我看来,这样做的好处在于易于以面向对象的方式表达业务逻辑,这可以通过Dapper这样的微型ORM实现,同时保留ADO.Net驱动程序的原始性能。