Azure移动服务C#不会返回子实体
我真的用新的基于C#的Azure移动服务打砖墙了,它也非常简单:(我不能为我的生活得到查询操作来返回子属性值。我有todo项目的默认项目修改如下:
public class TodoItem : EntityData { public TodoItem() { this.Numbers = new Collection(new List { new TodoItemNumbers{Value = 1}, new TodoItemNumbers{Value = 2}, new TodoItemNumbers{Value = 3}, new TodoItemNumbers{Value = 4}, new TodoItemNumbers{Value = 5}, }); } public virtual ICollection Numbers { get; set; } public string Text { get; set; } public bool Complete { get; set; } }
然后我将TodoItemNumbers类定义如下:
public class TodoItemNumbers : EntityData { private int _value; public int Value { get { return _value; } set { _value = value; Id = value.ToString(); } } public string TodoItemId { get; set; } }
在TodoItemController中,我已经像这样重写了Query方法
protected override IQueryable Query() { return base.Query().Include(x => x.Numbers); }
当我向Fiddler发出请求时,这些都不会返回Numbers属性。 在疯狂的时刻,我还修改了控制器的Initialize方法,包括:
protected override void Initialize(HttpControllerContext controllerContext) { base.Initialize(controllerContext); myContext context = new myContext(); context.Configuration.LazyLoadingEnabled = false; context.Configuration.ProxyCreationEnabled = false; DomainManager = new EntityDomainManager(context, Request, Services); }
请注意,延迟加载和代理创建都已关闭。 有谁知道如何击败这个简单的场景? 我感觉不到这个好的共鸣。
更新所以,正如我在下面的回答,我能够通过在$ expand中添加查询来获得服务以返回数据。 然而,现在我真的不知道让客户端将该参数添加到请求中。 它总是只返回基础数据。
var data = await App.MobileService.GetTable() .ToListAsync();
将不返回子属性,并且结果类型上没有Include选项
我的错误并不是将OData部分放入等式中。 我一询问
http://localhost:51025/tables/todoitem?$expand=Numbers
代替
http://localhost:51025/tables/todoitem
它神奇地出现了。 现在我如何在客户端API中遇到这个问题? 更新我使用此代码在客户端管理它
var json = await App.MobileService.GetTable("TodoItem") .ReadAsync("$expand=Numbers"); JsonConvert.DeserializeObject(json.First.ToString());
但必须有更好的方法
也可以通过在客户端上添加处理程序来实现它:
var client = new MobileServiceClient("http://xxxxxx/", null, new ODataParameterHandler()); public class ODataParameterHandler : DelegatingHandler { protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { UriBuilder builder = new UriBuilder(request.RequestUri); builder.Query = builder.Query .Replace("expand", "$expand") .TrimStart('?'); request.RequestUri = builder.Uri; return await base.SendAsync(request, cancellationToken); } }
用法:
var test = await client.GetTable() .WithParameters(new Dictionary { { "expand", "Something" } }) .ToListAsync();
GetAllTodoItems
方法如下所示,而不是重写Query
方法:
public IList GetAllTodoItems() { return context.TodoItems.Include( "Numbers" ).ToList(); }
这是$expand
hack的替代方案。 我在为自己探索Azure App Service移动应用程序时发现了它。 像你最初尝试的那样单独Include
一个Include
调用对我来说会更有意义。 接下来,我想弄清楚为什么不起作用。
我以为是。在gettable之后包含(x => x.Numbers)
我有同样的问题,并使用扩展帮助。 然后@carlosfigueira建议在这里处理这种情况的更好方法
我们如何在基于Dot Net的Azure移动服务中加载相关对象(Eager Loading)?
请看一看。 到目前为止,解决这个问题的最佳方法。 Supreet
- 如何在Windows Azure(工作器)角色中捕获未处理的exception
- 在Azure Web角色中禁用IIS空闲超时
- 如何使用用户凭据访问Azure Key Vault?
- Azure云服务:“不允许请求的注册表访问”。 VS2015
- 自创建数据库以来,支持’–Context’上下文的模型已更改 – 但db是新的生产数据库
- 未声明’AssemblyInfoFileMask’。 由于其保护级别,它可能无法访问
- Azure应用服务 – 自定义身份validation – 不允许HTTP动词
- PUT和Delete不能与Windows Azure上的ASP.NET WebAPI和数据库一起使用
- Stackexchange.Redis超时和socketfailures