【发布时间】:2022-01-04 10:35:19
【问题描述】:
我有权决定以下问题:
2 个对象(即订单和预算,此处简化):
class Order {
double Price;
}
class Budget{
double InternalBudget;
double ProjectBudget;
}
现在是以下问题: 添加新订单时,预算也必须更新。 现在,更好的方法是什么:
在一个数据访问方法中同时进行,例如:
Order SaveOrderAndUpdateRemainingBudget(Order order, budget updateBudget)
{
// add/update both to DB and dbContext.SaveChanges()
}
或
Order UpdateOrder(Order order)
{
// update order
}
Budget UpdateBudget(Budget budget)
{
// update budget and dbContext.SaveChanges()
}
我对第二种方法的看法:如果更新预算失败,我有一个不一致的数据库状态,插入了订单但预算有一个过时的值。
对处理该问题的最佳方式有何建议?
【问题讨论】:
-
EF 使用事务来确保同时写入所有数据库更新 (ACID)。您需要做的就是确保 SaveChanges/SaveChangesAsync 在所有更新完成后只发生一次。
-
可能值得考虑使用数据库触发器。
-
@KieranDevlin - 考虑一个触发器然后尖叫着跑开!我认为它们是邪恶的,几乎在所有情况下都应该避免;几乎总是有更好的方法来做事而不诉诸触发器,当人们没有意识到他们在那里时,这不可避免地会导致问题。将逻辑保留在您的应用中。
-
@Mog0 这是糟糕的轶事建议。我同意您应该尽可能将业务逻辑保留在数据库之外,但有时从设计、性能和简单性的角度来看这是有意义的。
-
@KieranDevlin 我的评论是半开玩笑的,但在我构建复杂 Web 应用程序的 20 年中,我发现唯一能更好地使用触发器的是跟踪数据库。我已经删除了许多触发器来整合应用程序逻辑,并且从未有任何性能损失,通常它的性能更好。这是轶事,我确信触发器可以很好地处理某些事情,但我相信这些是例外,通常结构良好的存储库模式可以更好地完成工作。当然其他人会有不同的看法
标签: c# entity-framework entity-framework-core