.net core 如何使用EF Core支持数据库中的数据一致性?

.net core 如何使用EF Core支持数据库中的数据一致性?,.net-core,ef-core-3.0,.net Core,Ef Core 3.0,我正在开发web api应用程序.net core 3.2。数据库-postgre,ORM-ef core 3.1.4 为了理解这个问题,我必须稍微描述一下业务领域。有警报,抽屉,抽屉设置。抽屉设置为使用该设置的抽屉定义了一些验证规则。更新抽屉设置后,某些抽屉与其抽屉设置之间可能存在冲突。F.e.让我们检查字段TrayConfiguration ID,请参见屏幕截图 当drawerset被更新时,将执行下一个逻辑 获取引用更新设置的所有抽屉 删除以前发出的所有警报(如果有) 查找当前Drawe

我正在开发web api应用程序.net core 3.2。数据库-postgre,ORM-ef core 3.1.4

为了理解这个问题,我必须稍微描述一下业务领域。有
警报
抽屉
抽屉设置
抽屉设置
为使用该设置的
抽屉定义了一些验证规则。更新
抽屉设置
后,某些
抽屉
与其
抽屉设置
之间可能存在冲突。F.e.让我们检查字段
TrayConfiguration ID
,请参见屏幕截图

drawerset
被更新时,将执行下一个逻辑

  • 获取引用更新设置的所有抽屉
  • 删除以前发出的所有警报(如果有)
  • 查找当前
    DrawerSettingAllowedTrayConfiguration不允许trayConfiguration的所有抽屉
  • 如果有-为表中的每个抽屉创建警报
    alert
  • 现在是问题。我需要在用户更新抽屉后自动解决警报。第一个解决方案是转到抽屉更新和检查警报已解决的位置-解决,或者根据需要创建新警报。但是,实体抽屉在许多地方受到影响。我可以创建一些服务并在任何地方使用它,但是将来可能会有更多这样的地方,下一个开发者必须了解我的服务。我不喜欢,甚至我可以忘记我的服务。)我能从别人那里得到什么?)所以我想到一些触发点或可观察到的。理想情况下,我想这样写smth

    // warning! just pseudo code
    
    class DrawerAlertValidationService {
        public void Track(DbContext dbContext) {
             new[] {
                 dbContext.Drawers,
                 dbContext.Trays
             }.ForEach(it => {
                 it.AfterUpdated(afterUpdatedValue => {
                     // ideally, after update I should return to client 200, so work with alerts would not affect the UX
                     switch(afterUpdatedValue) {
                         case Drawer drawer:
                              var alerts = dbContext.Alerts.Where(it => it.RaisedByDrawerId == drawer.Id);
                              alerts.ForEach(alert => ResoveIfNeccary(alert, drawer));
                              // ... 
                         case Tray tray:
                              var drawer = dbContext.Drawers.Where(it => it.TrayId == tray.Id);
                              var alerts = dbContext.Alerts.Where(it => it.RaisedByDrawerId == drawer.Id);
                              alerts.ForEach(alert => ResoveIfNeccary(alert, drawer));
                              // ...
                          default: throw new Exception("...");
                     }
                 }
             }
        }
    }
    
    DbContext(IDrawerAlertValidationService drawerAlertValidationService) {
            drawerAlertValidationService.Track(this);
    }
    
    我在.net核心世界中没有此类问题的经验,我正在寻找解决方案

  • 将允许独立于程序中已更新的位置来验证警报
  • 尝试从web api流验证警报。例如,我们正在调用端点
    PUT/drawers/{id}
    抽屉立即更新并返回,警报的验证不会影响
    PUT/drawers/{id}
    的性能和结果
  • 很容易支持
  • 目前我对数据库触发器有一些想法,但我认为,最好使用C#代码,从我的角度来看,它更容易支持,因为逻辑将放在一种语言、一个域、IDE和VCS的支持下

    此外,我还考虑过让抽屉可以被观察到,并指定反应:)但我不确定,即使是在引擎盖下的postgre也能做到这一点