我有一个简单的TodoItem示例,其中包含脱机同步。 ALl效果很好。 检测到冲突并且客户端捕获 MobileServicePreconditionFailedException 异常。
现在,当我修改TableController以使用Dto映射并使用自定义MappedEntityDomainManager时,我永远不会得到 MobileServicePreconditionFailedException 异常。
我错过了什么?
我修改了Microsoft TodoItem示例以演示此问题,因此唯一的区别是DomainManager和TableController。
DTO和Entity都是从EntityData派生的,因此它具有所有必需的属性Version,UpdatedAt等......
public class TodoItemDto : EntityData
{
public string Text { get; set; }
public bool Complete { get; set; }
public bool bWorks { get; set; }
}
public class TodoItem : EntityData
{
public string Text { get; set; }
public bool Complete { get; set; }
}
sql表与microsoft示例中的相同。
如果我删除DomainManager并在TableController实体中使用而不是DTO,那么一切都很好。
谢谢
控制器如下所示:
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.Http.Controllers;
using System.Web.Http.OData;
using AutoMapper;
using AutoMapper.QueryableExtensions;
using Microsoft.Azure.Mobile.Server;
using TimeCardSyncSrv.DataObjects;
using TimeCardSyncSrv.Models;
namespace TimeCardSyncSrv.Controllers
{
public class TodoItemController : TableController<TodoItemDto>
{
protected override void Initialize(HttpControllerContext controllerContext)
{
base.Initialize(controllerContext);
MobileServiceContext context = new MobileServiceContext();
DomainManager = new TodoItemMappedEntityDomainManager(context, Request);
}
// GET tables/TodoItem
public IQueryable<TodoItemDto> GetAllTodoItems()
{
return Query();
}
// GET tables/TodoItem/48D68C86-6EA6-4C25-AA33-223FC9A27959
public SingleResult<TodoItemDto> GetTodoItem(string id)
{
return Lookup(id);
}
// PATCH tables/TodoItem/48D68C86-6EA6-4C25-AA33-223FC9A27959
public Task<TodoItemDto> PatchTodoItem(string id, Delta<TodoItemDto> patch)
{
return UpdateAsync(id, patch);
}
// POST tables/TodoItem
public async Task<IHttpActionResult> PostTodoItem(TodoItemDto item)
{
TodoItemDto 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);
}
public static void AddMap(IConfiguration cfg)
{
cfg.CreateMap<TodoItem, TodoItemDto>();
cfg.CreateMap<TodoItemDto, TodoItem>();
}
}
}
mappedentity经理看起来像这样:
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
using System.Web.Http.OData;
using Microsoft.Azure.Mobile.Server;
using TimeCardSyncSrv.DataObjects;
using TimeCardSyncSrv.Models;
namespace TimeCardSyncSrv.Controllers
{
public class TodoItemMappedEntityDomainManager
: MappedEntityDomainManager<TodoItemDto, TodoItem>
{
public TodoItemMappedEntityDomainManager(DbContext context,
HttpRequestMessage request)
: base(context, request)
{
}
public override SingleResult<TodoItemDto> Lookup(string id)
{
return this.LookupEntity(p => p.Id == id);
}
public override Task<TodoItemDto> UpdateAsync(string id, Delta<TodoItemDto> patch)
{
return this.UpdateEntityAsync(patch, id);
}
public override Task<bool> DeleteAsync(string id)
{
return this.DeleteItemAsync(id);
}
}
}
TodoItem和TodoItemDto都是从EntityData派生的。
答案 0 :(得分:0)
我书中的MappedEntityDomainManager参考:https://adrianhall.github.io/develop-mobile-apps-with-csharp-and-azure/chapter3/domainmgr/#existing-table-relationships-with-the-mappedentitydomainmanager
您发布的信息并不表示完整设置。我已经测试了书中的设置。您是否在启动代码中初始化了Automapper?这似乎是可能缺失的一点。