首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并发访问,为什么EntityFramework 6不生成DbUpdateConcurrencyException?

并发访问,为什么EntityFramework 6不生成DbUpdateConcurrencyException?
EN

Stack Overflow用户
提问于 2016-11-09 18:36:12
回答 1查看 239关注 0票数 1

我必须在我们的框架中管理并发性,但是我不能生成DbUpdateConcurrencyException。我们使用SQL Server2008、EF6和AutoMapper 5。

SQL

代码语言:javascript
复制
ALTER TABLE [Keyword].[Keyword] ADD Rowversion [Rowversion] NOT NULL

模型

代码语言:javascript
复制
[Table("Keyword", Schema = "Mailing")]
public class KeywordModel : _Auditable
{
    [Key]
    public int KeywordId { get; set; }

    public string Name { get; set; }
    public string Hashtag { get; set; }
    public string Namespaces { get; set; }
    public string Html { get; set; }

    [Timestamp]
    [ConcurrencyCheck]
    public virtual byte[] RowVersion { get; set; }
}

ViewModel

代码语言:javascript
复制
public class KeywordEditViewModel
{
    [HiddenInput(DisplayValue = false)]
    public int KeywordId { get; set; }

    [Display(Name = "Name")]
    public string Name { get; set; }

    [Display(Name = "Hashtag")]
    public string Hashtag { get; set; }

    [Display(Name = "Namespaces")]
    [Description("Separate namespaces by ','")]
    public string Namespaces { get; set; }

    [Required]
    [AllowHtml]
    [UIHint("MultilineText")]
    [Display(Name = "Html")]
    [Description("Prefix or sufix your razor variables with #")]
    public string Html { get; set; }

    [Timestamp]
    [ConcurrencyCheck]
    public byte[] RowVersion { get; set; }
}

控制器

代码语言:javascript
复制
    [HttpPost]
    public virtual ActionResult Edit(KeywordEditViewModel model, string @return)
    {
        var data = new JsonResultData(ModelState);

        if (ModelState.IsValid)
        {
            data.RunWithTry((resultData) =>
            {
                KeywordManager.Update(model.KeywordId, model, CurrentUser.UserId);
                resultData.RedirectUrl = !string.IsNullOrEmpty(@return) ? @return : Url.Action("Index");
            });
        }

        return Json(data);
    }

业务

代码语言:javascript
复制
    public KeywordModel Update(int id, object viewmodel, int userId)
    {
        var model = Get(id);

        Mapper.Map(viewmodel, model);
        SaveChanges("Update mailing keyword", userId);

        return model;
    }

AutoMapper

代码语言:javascript
复制
CreateMap<KeywordModel, KeywordEditViewModel>();
CreateMap<KeywordEditViewModel, KeywordModel>();

在我的测试中,RowVersion字段在数据库中具有不同的值,但是SaveChange不会生成异常DbUpdateConcurrencyException。

SQL跟踪

代码语言:javascript
复制
UPDATE [Mailing].[Keyword]
SET [Namespaces] = @0, [audit_LastUpdate] = @1
WHERE (([KeywordId] = @2) AND ([RowVersion] = @3))
SELECT [RowVersion]
FROM [Mailing].[Keyword]
WHERE @@ROWCOUNT > 0 AND [KeywordId] = @2 
@0: 'titi' (Type = String, Size = -1)
@1: '09/11/2016 13:35:54' (Type = DateTime2)
@2: '1' (Type = Int32)
@3: 'System.Byte[]' (Type = Binary, Size = 8)
EN

回答 1

Stack Overflow用户

发布于 2018-02-16 06:14:46

迟到总比不到好。

经过几个小时的搜索,我解决了这个问题。EF,自动映射器,视图模型,所有的九个。在写了几十篇文章之后,终于有人说了些什么,让我找到了正确的方向,实际上这是一个相当简单的解决方法。

当您执行此调用时: var model = Get(id);要获取当前值,然后将更新映射到top,将使用它选择新行版本。

Get的修复是让“(Id)”选择而不跟踪。问题解决了。在我的例子中,我的repo有一个"Edit(entity)“方法,它将对象标记为已修改,如果它被分离,则附加它。你也可以在这里做同样的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40504902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档