gpt4 book ai didi

asp.net-mvc-3 - Entity Framework 乐观并发异常未发生

转载 作者:行者123 更新时间:2023-12-02 15:20:06 25 4
gpt4 key购买 nike

我们有一个 ASP.Net MVC 应用程序,该应用程序使用 EF4 作为其数据访问层,我们发现在我们认为应该抛出 OptimisitcConcurrencyExceptions 时却没有抛出异常行为。

我们已将问题简化为以下代码...

   using System.Linq;
using Project.Model;

namespace OptimisticConcurrency
{
class Program
{
static void Main()
{
Contact firstContact = null;
using (var firstEntities = new ProjectEntities())
{
firstContact = (from c in firstEntities.Contacts
where c.LastName == "smith" select c).Single();
}

using (var secondEntities = new ProjectEntities())
{
var secondContact = (from c in secondEntities.Contacts
where c.LastName == "smith" select c).Single();

secondContact.Title = "a";
secondEntities.SaveChanges();
}

firstContact.Title = "b";

using (var thirdEntities = new ProjectEntities())
{
var thirdContact = (from c in thirdEntities.Contacts
where c.LastName == "smith" select c).Single();

thirdContact.Title = firstContact.Title;

//EXPLICITLY SET VERSION HERE
thirdContact.Version = firstContact.Version;

thirdEntities.SaveChanges();
}
}
}
}

这是我们的 MVC 应用程序中发生的情况的一个相当简单的版本,但出现了同样的问题。

当我们对 ThirdEntities 调用 SaveChanges 时,我预计会出现异常,并且不会引发任何异常。

更有趣的是,当我们附加 SQL Profiler 时,我们看到在 where 子句中使用了 Version,但使用的是 ThirdEntities Version 值(数据库中的当前版本),而不是 firstEntities 值,尽管它是在调用 SaveChanges 之前立即显式设置。 SaveChanges 正在将版本重置为检索到的值而不是设置值。

在 EDMX 中,版本设置为将 StoreGeneratePattern 设置为已计算。

有人知道这里发生了什么吗?

最佳答案

这是一个问题。将列设置为已计算后,您将无法在应用程序中设置其值(可以,但不会使用该值)。

编辑:

如果您从数据库加载实体,则默认情况下会使用上下文对其进行跟踪。上下文存储其原始值。例如,原始值用于快照更改跟踪,但它们也用作计算属性的唯一有效源。如果您在实体中设置Compulated属性,则不会使用该值,而是使用原始值。解决方法是修改原始值(在修改其他任何内容之前):

using (var context = new TestEntities())
{
var entityToUpdate = context.MyEntities.Single(e => e.Id == someId);
entityToUpdate.Timestamp = entity.Timestamp;

ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(entityToUpdate);
entry.ApplyOriginalValues(entityToUpdate);

// set modified properties
context.SaveChanges();
}

编辑2:

顺便说一句。一旦您实际加载了时间戳和之前检索到的时间戳,您就可以简单地 compare them in your application而不是在数据库中进行。

关于asp.net-mvc-3 - Entity Framework 乐观并发异常未发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5327649/

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