首页 文章

应用服务移动应用 - “无法在类型'Backend.DataObjects.Game'上找到名为'updatedAt'的属性 . ”

提问于
浏览
1

我正在尝试将Azure Mobile Apps与Xamarin Forms客户端和.net后端一起使用 . 我正在使用MikeCodesDotNet / App-Service-Helpers来帮助我开始在客户端 . 我尝试的第一个实体是一个简单的游戏实体 .

当客户端加载时,它会使GET请求获得游戏,但它使用updatedAt,似乎服务器需要UpdatedAt .

请求是:http://192.168.0.105/Backend/tables/Game?$ filter =(updatedAt%20ge%20datetimeoffset%271970-01-01T00:00:00.0000000%2B00:00%27)&$ orderby = updatedAt&$ skip = 0&$ top = 50&__ includeDeleted = true

失败了

{$ id:"1",消息:“ The query specified in the URI is not valid. Could not find a property named 'updatedAt' on type 'Backend.DataObjects.Game' . ", exceptionMessage: "在Microsoft.Data.OData.Query.EndPathBinder.GeneratePropertyAccessQueryForOpenType(EndPathToken endPathToken,SingleValueNode parentNode)上找不到类型'AthelinkBackend.DataObjects.Game'上的名为'updatedAt'的属性.", exceptionType: " Microsoft.Data.OData.ODataException ", stackTrace: " )在Microsoft.Data.OData.Query.OrderByBinder.ProcessSingleOrderBy(BindingState)的Microsoft.Data.OData.Query.MetadataBinder.Bind(QueryToken令牌)的Microsoft.Data.OData.Query.EndPathBinder.BindEndPath(EndPathToken endPathToken,BindingState状态)在Microsoft.Data.OData.Query.ODataUriParser.ParseOrderByImplementation中的Microsoft.Data.OData.Query.OrderByBinder.BindOrderBy(BindingState state,IEnumerable`1 orderByTokens)中的state,OrderByClause thenBy,OrderByToken orderByToken)(String orderBy,IEdmType elementType,IEdmEntitySet entitySet )在System.Web.Http.OData.Query.Validators.OrderByQueryValidator.Validate的System.Web.Http.OData.Query.OrderByQueryOption.get_OrderByClause()处SystemB上的System.Web.Http.OData.Query.OrderByQueryOption.Validate(ODataValidationSettings validationSettings)中的(OrderByQueryOption orderByOption,ODataValidationSettings validationSettings)System.Web.Http.OData.Query.Validators.ODataQueryValidator.Validate(ODataQueryOptions options,ODataValidationSettings validationSettings) System.Web.Http.OData.EnableQueryAttribute.ExecuteQuery(对象响应)中的System.Web.Http.OData.EnableQueryAttribute.ValidateQuery(HttpRequestMessage请求,ODataQueryOptions queryOptions)中的.Web.Http.OData.Query.ODataQueryOptions.Validate(ODataValidationSettings validationSettings) ,HttpRequestMessage请求,HttpActionDescriptor actionDescriptor)在System.Web.Http.OData.EnableQueryAttribute.OnActionExecuted(HttpActionExecutedContext actionExecutedContext)“}

在Chrome中,我在GET vars中使用UpdatedAt运行相同,但它正确完成 .

我不知道如何解决此问题或如果它是客户端问题或服务器问题 .

在客户端:

namespace GamesClient.Models
{
    public class Game : AppServiceHelpers.Models.EntityData
    {
        public string Name { get; set; }
        public string Type { get; set; }
    }
}

在服务器上:

namespace Backend.DataObjects
{
    public class Game : EntityData
    {
        public string Name { get; set; }
        public string Type { get; set; }

        public virtual Collection<Participant> Participants { get; set; }
    }
}

namespace Backend.Controllers
{
    [AllowAnonymous]
    public class GameController : TableController<Game>
    {
        protected override void Initialize(HttpControllerContext controllerContext)
        {
            base.Initialize(controllerContext);
            MobileServiceContext context = new MobileServiceContext();
            DomainManager = new EntityDomainManager<Game>(context, Request, Services);
        }

        // GET tables/Game
        public IQueryable<Game> GetAllGame()
        {
            return Query(); 
        }

        // GET tables/Game/48D68C86-6EA6-4C25-AA33-223FC9A27959
        public SingleResult<Game> GetGame(string id)
        {
            return Lookup(id);
        }

        // PATCH tables/Game/48D68C86-6EA6-4C25-AA33-223FC9A27959
        public Task<Game> PatchGame(string id, Delta<Game> patch)
        {
             return UpdateAsync(id, patch);
        }

        // POST tables/Game
        public async Task<IHttpActionResult> PostGame(Game item)
        {
            Game current = await InsertAsync(item);
            return CreatedAtRoute("Tables", new { id = current.Id }, current);
        }

        // DELETE tables/Game/48D68C86-6EA6-4C25-AA33-223FC9A27959
        public Task DeleteGame(string id)
        {
             return DeleteAsync(id);
        }

    }
}

更新#1

我检查了数据库,看起来表格正确创建 . 我甚至可以从Xamarin客户端进行POST / INSERT,它可以正常工作 .

Database tables and data in the Games table

我真的认为它是GET请求过滤器中的UpdatedAt和updatedAt大写之间的问题 .

(1)来自Xamarin客户端的GET(使用updatedAt):

$ filter =( updatedAt %20ge%20datetimeoffset%271970-01-01T00:00:00.0000000%2B00:00%27)&$ orderby = updatedAt &$ skip = 0&$ top = 50&__ includeDeleted = true

导致上面的错误消息

(2)从Chrome获取GET(更改使用UpdatedAt的请求):

$ filter =( UpdatedAt %20ge%20datetimeoffset%271970-01-01T00:00:00.0000000%2B00:00%27)&$ orderby = UpdatedAt &$ skip = 0&$ top = 50&__ includeDeleted = true

导致正确的反应

[
{
$id: "1",
id: "46d3db2c-c8d4-4a15-8724-d7ce95611a63",
type: "football ",
name: "game1"
},
{
$id: "2",
id: "02d02477-2618-4eda-90ad-34e4117ed423",
type: "basketball ",
name: "game2"
}
]

在服务器端,我的游戏是Microsoft.WindowsAzure.Mobile.Service.EntityData的孩子

在客户端,Game对象是EntityData类的子级,具有以下UpdatedAt属性定义

[Microsoft.WindowsAzure.MobileServices.UpdatedAt]
public DateTimeOffset UpdatedAt { get; set; }

另外,请让我知道我可以提供哪些日志来帮助,谢谢!

2 回答

  • 0

    对我有用的解决方案是在您的移动客户端上设置以下属性 .

    var client = new MobileServiceClient(...);
    client.SerializerSettings.CamelCasePropertyNames = false;
    

    这可以防止在odata查询中将属性名称序列化为驼峰大小写 .

  • 1

    看起来数据库表没有正确设置 . 这可能有很多原因 . 其中一个比较常见的是你从TodoItem表开始,发布了(创建了TodoItems数据库表),然后更新了服务器后端以创建新表,它就失败了 . 这是因为创建数据库(初始模式创建)是为您完成的,但更新不是 . 您需要使用代码优先迁移来正确更新数据库(就像任何其他基于实体的框架一样)服务) . 可能还有其他事情发生 - 不幸的是,您提供的日志没有显示任何内容 .

    如果可以,请清除数据库并从空白数据库开始 .

    另外,请阅读这本书 - http://aka.ms/zumobook

相关问题