gpt4 book ai didi

entity-framework - 如何在 Entity Framework 5 中增加/减少多用户安全

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

什么是增加或减少整数字段的干净、安全的方法。

我将 sql server 2012 与 entityframework 5.x 结合使用

我寻找等效于互锁增量/减量。

最佳答案

标准方法是使用乐观并发。

假设您有一个带有整数字段的简单实体 Counter你想增加或减少:

public class SomeEntity
{
public int SomeEntityId { get; set; }
public int Counter { get; set; }
}

您可以标记 Counter然后作为并发 token 。使用 Fluent API,它是:

modelBuilder.Entity<SomeEntity>()
.Property(s => s.Counter)
.IsConcurrencyToken();

然后你可以增加或减少 Counter例如像这样:

public void IncDecCounter(int someEntityId, bool dec)
{
using (var context = new MyContext())
{
var someEntity = context.SomeEntities.Find(someEntityId);
if (someEntity != null)
{
bool saveFailed;
do
{
saveFailed = false;

if (dec)
--someEntity.Counter;
else
++someEntity.Counter;

try
{
context.SaveChanges();
}
catch (DbUpdateConcurrencyException e)
{
saveFailed = true;
e.Entries.Single().Reload();
}
} while (saveFailed);
}
}
}
SaveChanges将失败并返回 DbUpdateConcurrencyException如果 Counter的值当实体被加载时(在这个例子中是 Find,可以是任何其他查询)不同于 Counter 的值在数据库中执行 UPDATE 语句时在数据库中,这意味着 Counter在此期间已被其他用户修改。从技术上讲,这是通过扩展 WHERE 实现的。生成的 UPDATE 语句的子句不仅尝试通过 Id 进行过滤,还尝试通过 Counter 的旧值进行过滤。 ,基本上是这样的: WHERE SomeEntityId = someEntityId AND Counter = oldCounterWhenTheEntityHasBeenLoaded .
catch块使用当前 Counter 重新加载实体值和下一个循环尝试再次增加或减少重新加载的值,直到它成功而没有并发冲突。

关于entity-framework - 如何在 Entity Framework 5 中增加/减少多用户安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15669383/

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