azure mobile app和MobileServicePreconditionFailedException

时间:2016-11-01 01:39:08

标签: xamarin azure-mobile-services

我有一个简单的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派生的。

1 个答案:

答案 0 :(得分:0)

我书中的MappedEntityDomainManager参考:https://adrianhall.github.io/develop-mobile-apps-with-csharp-and-azure/chapter3/domainmgr/#existing-table-relationships-with-the-mappedentitydomainmanager

您发布的信息并不表示完整设置。我已经测试了书中的设置。您是否在启动代码中初始化了Automapper?这似乎是可能缺失的一点。