在Azure应用服务移动后端服务中,REST API请求由TableController实现处理。可以使用客户端SDK中提供的相应方法调用这些方法。因此,我可以查询特定实体并从客户端更新其状态。
但是如何在服务器端或同一个控制器中调用它们?例如,如果我想查询特定的todoItem并从某个自定义方法更新其状态,如
在这里,我不知道如何创建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);
}
}
答案 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上下文。