我正在尝试将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 回答
对我有用的解决方案是在您的移动客户端上设置以下属性 .
这可以防止在odata查询中将属性名称序列化为驼峰大小写 .
看起来数据库表没有正确设置 . 这可能有很多原因 . 其中一个比较常见的是你从TodoItem表开始,发布了(创建了TodoItems数据库表),然后更新了服务器后端以创建新表,它就失败了 . 这是因为创建数据库(初始模式创建)是为您完成的,但更新不是 . 您需要使用代码优先迁移来正确更新数据库(就像任何其他基于实体的框架一样)服务) . 可能还有其他事情发生 - 不幸的是,您提供的日志没有显示任何内容 .
如果可以,请清除数据库并从空白数据库开始 .
另外,请阅读这本书 - http://aka.ms/zumobook