【问题标题】:Entity Framework Code First with Fluent API Concurrency `DbUpdateConcurrencyException` Not Raising实体框架代码优先与流利的 API 并发`DbUpdateConcurrencyException` 未引发
【发布时间】:2015-06-08 13:02:48
【问题描述】:

我正在尝试使用实体框架 6 处理并发。我的实体如下所示;

public partial class Group : BaseEntity
{
    public byte[] RowVersion { get; set; }
    ...............
}

映射

public partial class GroupMap : EntityTypeConfiguration<Group>
{
    public GroupMap()
    {
        this.ToTable("CRM_Sales_Group");
        this.HasKey(c => c.Id);
        //tried like this too -> this.Property(e => e.RowVersion).IsRowVersion();
        this.Property(e => e.RowVersion).IsConcurrencyToken().IsRowVersion();
    }

通用存储库更新方法不会修改状态,它只是验证然后我调用 savechanges();

            public virtual void Update(T entity)
            {
                try
                {
                    if (entity == null)
                        throw new ArgumentNullException("entity");
                }
                catch (DbEntityValidationException dbEx)
                {
                    var msg = string.Empty;

                    foreach (var validationErrors in dbEx.EntityValidationErrors)
                        foreach (var validationError in validationErrors.ValidationErrors)
                            msg += Environment.NewLine + string.Format("Property: {0} Error: {1}", validationError.PropertyName, 

validationError.ErrorMessage);

                    var fail = new Exception(msg, dbEx);
                    //Debug.WriteLine(fail.Message, fail);
                    throw fail;
                }
            }
        }
       _groupRepository.Update(group);

在 Razor 视图中;

@Html.HiddenFor(model => model.RowVersion)

在控制器中捕捉它仍然没有运气

        public ActionResult Edit(GroupModel model)
        {

            if (ModelState.IsValid)
            {
                try
                {
                    group = model.ToEntity(group);
                    _groupService.UpdateGroup(group);

                    ContainerResolver.Resolve<IDbContext>().SaveChanges();

                }
                catch (DbUpdateConcurrencyException ex)
                {
                    var entry = ex.Entries.Single();
                    throw;
                }
            }
            return View(model);
        }

我真正错过了什么?

更新 1

好吧,我正在尝试遵循官方文档。 http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/handling-concurrency-with-the-entity-framework-in-an-asp-net-mvc-application。我尝试在浏览器的两个不同选项卡中编辑同一记录,并在另一个选项卡更新中更新了一条记录和同一记录。 rowversion 值不同,但未触发异常。

【问题讨论】:

  • 您能否完整描述数据库的两次更新,您具体在做什么? EF Optimistic 并发机制确保您在拥有“旧数据”时不会更新数据库。
  • 控制器方法中解析的 dbcontext 是否与存储库中使用的实例相同?
  • 我正在尝试遵循官方文档。 asp.net/mvc/overview/getting-started/…。我尝试在浏览器的两个不同选项卡中编辑同一记录,并在另一个选项卡更新中更新了一条记录和同一记录。 rowversion 值不同,但未触发异常。
  • 我不是 EF 专家,因此可能只是在上面遗漏了它 - rowversionwhere 子句在哪里?
  • 将 SQL 日志记录添加到您的 dbcontext 以查看在您 SaveChanges 时生成的 SQL。您可以使用类似于此的行来执行此操作:context.Database.Log = s =&gt; Console.WriteLine(s);。 (如果控制台不合适,您可以将其指向其他内容)然后使用您看到的 SQL 编辑您的帖子。这会有所帮助。

标签: c# asp.net asp.net-mvc entity-framework concurrency


【解决方案1】:

其实我不见了

db.Entry(departmentToUpdate).OriginalValues["RowVersion"] = rowVersion;

现在它的工作:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多