.net core 如何使用EF Core支持数据库中的数据一致性?
我正在开发web api应用程序.net core 3.2。数据库-postgre,ORM-ef core 3.1.4 为了理解这个问题,我必须稍微描述一下业务领域。有.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
警报
,抽屉
,抽屉设置
。抽屉设置
为使用该设置的抽屉定义了一些验证规则。更新抽屉设置
后,某些抽屉
与其抽屉设置
之间可能存在冲突。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也能做到这一点