Azure应用服务 - 从表控制器更新对象

时间:2016-05-09 15:20:42

标签: azure azure-mobile-services azure-web-app-service

在Azure应用服务移动后端服务中,REST API请求由TableController实现处理。可以使用客户端SDK中提供的相应方法调用这些方法。因此,我可以查询特定实体并从客户端更新其状态。

但是如何在服务器端或同一个控制器中调用它们?例如,如果我想查询特定的todoItem并从某个自定义方法更新其状态,如

  1. 使用LookUp(id)获取项目
  2. 更新状态
  3. 使用UpdateAsync(id,item)
  4. 在这里,我不知道如何创建TodoItem的Delta对象来调用UpdateAsync(id,patch)方法。

     public class TodoItemController : TableController<TodoItem>
    {
        protected override void Initialize(HttpControllerContext controllerContext)
        {
            base.Initialize(controllerContext);
            initrackerserviceContext context = new initrackerserviceContext();
            DomainManager = new EntityDomainManager<TodoItem>(context, Request);
        }
    
        // GET tables/TodoItem
        public IQueryable<TodoItem> GetAllTodoItems()
        {
            return Query();
        }
    
        // GET tables/TodoItem/48D68C86-6EA6-4C25-AA33-223FC9A27959
        public SingleResult<TodoItem> GetTodoItem(string id)
        {
            return Lookup(id);
        }
    
        // PATCH tables/TodoItem/48D68C86-6EA6-4C25-AA33-223FC9A27959
        public Task<TodoItem> PatchTodoItem(string id, Delta<TodoItem> patch)
        {
            return UpdateAsync(id, patch);
        }
    
        // POST tables/TodoItem
        public async Task<IHttpActionResult> PostTodoItem(TodoItem item)
        {
            TodoItem current = await InsertAsync(item);
            return CreatedAtRoute("Tables", new { id = current.Id }, current);
        }
    
        // DELETE tables/TodoItem/48D68C86-6EA6-4C25-AA33-223FC9A27959
        public Task DeleteTodoItem(string id)
        {
            return DeleteAsync(id);
        }
    }
    

2 个答案:

答案 0 :(得分:3)

只需使用标准的实体框架机制。例如,要查找和更新具有状态的记录,您只需使用上下文:

var item = await context.TodoItems.Where(i => i.Id.Equals(myId)).FirstOrDefaultAsync<TodoItem>();
if (item != null) {
    item.Complete = true;
    context.Entry(item).State = EntityState.Modified;
    await context.SaveChangesAsync();
}

我的EF编码并不是最好的,但您应该明白这一点。只需执行实体框架即可。

答案 1 :(得分:1)

最好使用已为我们here in the source code of EntityDomainManager实施的TableController.ReplaceAsync()方法。

var item = Lookup(item.Id).Queryable.FirstOrDefault();
if (item != null) 
{
    item.Complete = true;
    item = await ReplaceAsync(item.Id, item);
}

ReplaceAsync()方法正确处理异常,因此我不建议直接使用EF上下文。