gpt4 book ai didi

NHibernate动态更新的缺点?

转载 作者:行者123 更新时间:2023-12-03 12:34:01 26 4
gpt4 key购买 nike

是否有理由不使用 dynamic-insert/dynamic-update对于 NHibernate?我问的唯一原因是它似乎是我希望作为默认启用的东西,而不是我必须配置的东西。

使用这些动态属性时有什么需要注意的问题吗?

最佳答案

对于某些实体,您可能会通过动态更新创建无效状态。假设您有一个 ClassBoolean属性(property)A和逻辑依赖 Integer属性(property)B .如果属性(property)ATrue , 然后属性 B只能是负数,而如果属性AFalse , 然后属性 B只能是正数。

假设两个用户都在给定的时间跨度内与此类的一个实例进行交互。首先,用户 Alice 和 Bob 都从数据库中实现了这个类,初始值为 A = 真和 B = -50

Database   Alice       Bob
A: True A: True A: True
B: -50 B: -50 B: -50
VALID VALID VALID

用户 Alice 变更 AFalseB到 125,并将其提交到数据库。现在我们有这样的情况:
Database   Alice       Bob
A: False A: False A: True
B: 125 B: 125 B: -50
VALID VALID VALID

用户 Bob 不变 A ,但更改 B到 -75,然后将其提交到数据库。如果启用动态更新,则 NHibernate 会看到 Bob 仅更改了 B到 -75,并发出仅编辑 B 值的动态更新.如果您在服务器上进行了 SQL 验证以防止 B除非 A 否则为负是的,您会在此处收到 SQL 错误,但假设您尚未在 SQL 表上复制所有业务逻辑。这是结果数据:
Database   Alice       Bob
A: False A: False A: True
B: -75 B: 125 B: -75
INVALID VALID VALID

Alice 和 Bob 都具有有效状态,但数据库现在处于无效状态!用户查理出现并试图实现这个记录:
Database   Alice       Bob       Charlie
A: False A: False A: True A: False
B: -75 B: 125 B: -75 B: -75
INVALID VALID VALID INVALID

当 NHibernate 尝试设置类的新实例的 B 属性时,查理可能会从您的应用程序中得到验证错误。

因此,当您具有逻辑上依赖的属性时,您必须制定一些策略来避免这种情况。一种可能性是简单地启用 select-before-update对于这个实体。这可能会导致一些额外的数据库调用和稍微降低性能。另一个是在 NHibernate 中使用版本控制,这意味着当 Bob 尝试保存他的记录时,NHibernate 的插入查询不会触发任何写入并抛出陈旧数据异常(可以正常处理)。您还可以将类的逻辑要求编入数据库中,但是您必须谨慎确保随着时间的推移数据库和程序都具有相同的编纂要求,并且您将有多个地方可以在需求变化时进行更改,这并不总是值得的开销。

所以简而言之,在许多情况下,开发人员必须仔细处理动态更新的细节,这就是默认情况下不启用的原因。当您打开它时,请考虑对您的实体进行部分更新是否会导致问题,如果是,请使用我推荐的一种缓解策略来防止该问题。

关于NHibernate动态更新的缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13954882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com