- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们有一个 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/
我正在编写一个 Web 应用程序,两个不同的用户可以在其中更新事物列表,例如待办事项列表。我已经意识到,乐观锁定机制效果最好,因为我不希望出现高争用情况。 我一直在查看事务隔离级别,现在我有点困惑。看
这个问题在这里已经有了答案: Pessimistic versus Optimistic Concurrency (Locking versus Feedback) (3 个答案) 关闭 8 年前。
我是一名优秀的程序员,十分优秀!