首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Asp.Net Web V4 -并发检查

Asp.Net Web V4 -并发检查
EN

Stack Overflow用户
提问于 2016-05-27 05:25:13
回答 1查看 459关注 0票数 0

下面的代码是从Wep v4脚手架工具生成的。

放置法

代码语言:javascript
复制
public IHttpActionResult Put([FromODataUri] string key, Delta<Product> patch)
{
    Validate(patch.GetEntity());

    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    Product product = db.Products.Find(key);
    if (product == null)
    {
        return NotFound();
    }

    patch.Put(product);

    try
    {
        db.SaveChanges();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!ProductExists(key))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }

    return Updated(product);
}

贴片法:

代码语言:javascript
复制
[AcceptVerbs("PATCH", "MERGE")]
public IHttpActionResult Patch([FromODataUri] string key, Delta<Product> patch)
{
    Validate(patch.GetEntity());

    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    Product product = db.Products.Find(key);
    if (product == null)
    {
        return NotFound();
    }

    patch.Patch(product);

    try
    {
        db.SaveChanges();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!ProductExists(key))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }

    return Updated(product);
}

中的Rowversion字段

代码语言:javascript
复制
[Timestamp]
public byte[] RowVersion { get; set; }

问题:

  1. 我需要实现并发性检查。如何以Odata方式(使用Etag)检查乐观并发性?
  2. 在上面的代码中,DbUpdateConcurrencyException从未抛出。有什么原因吗?
  3. 有一个名为[ConcurrencyCheck]的属性,它的用途是什么?我能用这个吗?

提供代码示例将是非常感谢的!

EN

回答 1

Stack Overflow用户

发布于 2016-06-07 21:20:54

我解决了这个问题,检查我自己的并发字段,因为补丁或put做不到。这是我的代码,plato.TimeStamp[Timestamp]属性。

代码语言:javascript
复制
   public async Task<IHttpActionResult> Put([FromODataUri] int key, Delta<Plato> patch)
    {
        Validate(patch.GetEntity());

        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        Plato plato = await db.Platos.FindAsync(key);
        if (plato == null)
        {
            return NotFound();
        }
//Here save the current value in the DB
        string timeStamp = Convert.ToBase64String(plato.TimeStamp);
        patch.Put(plato);

        try
        {
//Here plato.TimeStamp is update from remote, must be equal to stored value
            if (timeStamp != Convert.ToBase64String(plato.TimeStamp))
            {
                throw new DbUpdateConcurrencyException();
            }
            await db.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!PlatoExists(key))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return Updated(plato);
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37475442

复制
相关文章

相似问题

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