gpt4 book ai didi

concurrency - Entity Framework 数据库优先: Timestamp column not working

转载 作者:行者123 更新时间:2023-12-04 13:19:41 26 4
gpt4 key购买 nike

使用db first方法,我希望我的应用程序每次尝试更新一个(过期的)实体时都引发并发异常,该实体的数据库中对应行已被另一个应用程序/用户/ session 更新。

我在.Net 4.5上使用Entity Framework 5。相应的表具有一个“时间戳记”列以维护行版本。

最佳答案

我过去通过将时间戳字段添加到要执行并发检查的表中来完成此操作。 (在我的示例中,我添加了一个名为ConcurrencyCheck的列)

根据您的需求,这里有两种类型的并发模式:

1并发模式:固定:

然后在模型中重新添加/刷新表。对于固定并发,在将表导入模型时,请确保将表的并发模式设置为fixed:

然后陷阱:

    try 

{

context.SaveChanges();

}

catch (OptimisticConcurrencyException ex) {


////handle your exception here...

2.并发模式:无

如果您希望处理自己的并发检查,即提出验证通知用户,甚至不允许进行保存,则可以将并发模式设置为无。

1.确保在刚添加到 “无”的新列的属性中更改 ConcurrencyMode
2.要在您的代码中使用此代码,我将创建一个变量以将您当前的时间戳存储在您要检查保存的屏幕上。
private byte[] CurrentRecordTimestamp 
{
get
{
return (byte[])Session["currentRecordTimestamp"];
}

set
{
Session["currentRecordTimestamp"] = value;

}
}

1,在页面加载时(假设您使用的是asp.net而不是上面没有提到的mvc/razor),或者当您使用希望编辑的数据填充屏幕时,我会在编辑的ConcurrencyCheck值下提取当前记录到您创建的此变量中。
 this.CurrentRecordTimestamp = currentAccount.ConcurrencyCheck;

然后,如果用户将记录保持打开状态,同时其他人对其进行了更改,然后他们又尝试保存,则可以将之前保存的时间戳值与现在的并发值进行比较。
if (Convert.ToBase64String(accountDetails.ConcurrencyCheck) != Convert.ToBase64String(this.CurrentRecordTimestamp)) 
{
}

关于concurrency - Entity Framework 数据库优先: Timestamp column not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18384242/

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