2014-04-26 16 views
8

Sto davvero colpendo un muro di mattoni con i nuovi servizi mobili Azure basati su C# ed è anche molto semplice :( Non riesco a ottenere la query operazione per restituire i valori di proprietà bambino ho la voce todo del progetto predefinito modificato in questo modo:.Servizi mobili di Azure C# non restituisce entità figlio

public class TodoItem : EntityData 
{ 
    public TodoItem() 
    { 
     this.Numbers = new Collection<TodoItemNumbers>(new List<TodoItemNumbers> 
     { 
      new TodoItemNumbers{Value = 1}, 
      new TodoItemNumbers{Value = 2}, 
      new TodoItemNumbers{Value = 3}, 
      new TodoItemNumbers{Value = 4}, 
      new TodoItemNumbers{Value = 5}, 
     }); 
    } 
    public virtual ICollection<TodoItemNumbers> Numbers { get; set; } 
    public string Text { get; set; } 
    public bool Complete { get; set; } 
} 

E poi ho la classe TodoItemNumbers definita in questo modo:

public class TodoItemNumbers : EntityData 
{ 
    private int _value; 

    public int Value 
    { 
     get { return _value; } 
     set 
     { 
      _value = value; 
      Id = value.ToString(); 
     } 
    } 

    public string TodoItemId { get; set; } 
} 

Nel TodoItemController I Hai ignorato la Query incontrata hod like this

protected override IQueryable<TodoItem> Query() 
{ 
    return base.Query().Include(x => x.Numbers); 
} 

Nessuno di ciò restituirà la proprietà Numbers quando faccio una richiesta con Fiddler. In un momento di follia ho anche modificato il metodo di inizializzazione del controller per includere questo:

protected override void Initialize(HttpControllerContext controllerContext) 
{ 
    base.Initialize(controllerContext); 
    myContext context = new myContext(); 
    context.Configuration.LazyLoadingEnabled = false; 
    context.Configuration.ProxyCreationEnabled = false; 
    DomainManager = new EntityDomainManager<TodoItem>(context, Request, Services); 
} 

Nota caricamento pigro e creazione di proxy sono stati entrambi spenti. Qualcuno sa come battere questo semplice scenario? Non sento le vibrazioni positive su questo.

Aggiornamento Quindi, come ho risposto qui di seguito sono stato in grado di ottenere il servizio per restituire i dati con l'aggiunta nel $ espandersi per la query. Ora però sono davvero bloccato a far sì che il client aggiunga quel parametro alla richiesta. Restituisce sempre solo i dati di base.

var data = await App.MobileService.GetTable<TodoItem>() 
     .ToListAsync(); 

non restituirà le proprietà secondarie, e non c'è un'opzione Includere sul tipo di risultato

+0

Se si rilascia il 'virtuale' dalla proprietà della raccolta non verrà utilizzato il carico lazy (questo non risponde alla nostra domanda ma potrebbe essere bello sapere) – BrunoLM

risposta

2

Il mio errore non è stato davvero mettendo la parte OData nell'equazione. Non appena ho chiesto

http://localhost:51025/tables/todoitem?$expand=Numbers 

invece di

http://localhost:51025/tables/todoitem 

magicamente apparso. Ora, come faccio a capirlo nell'API client ...? Aggiornamento ho gestito sul lato client con questo codice

var json = 
        await 
         App.MobileService.GetTable("TodoItem") 
          .ReadAsync("$expand=Numbers"); 
JsonConvert.DeserializeObject<TodoItem>(json.First.ToString()); 

Ma ci deve essere un modo migliore

0

ho pensato che fosse .include (x => x.Numbers) dopo la gettable

+0

no, questo è quello che ho nel mio codice. Ho pensato che dovrebbe funzionare anche. – Dylan

2

E 'anche possibile ottenere con l'aggiunta di un gestore sul client:

var client = new MobileServiceClient("http://xxxxxx/", null, new ODataParameterHandler()); 

public class ODataParameterHandler : DelegatingHandler 
{ 
    protected override async Task<HttpResponseMessage> 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); 
    } 
} 

Usage:

var test = await client.GetTable<TodoItem>() 
    .WithParameters(new Dictionary<string, string> { { "expand", "Something" } }) 
    .ToListAsync(); 
1

Invece di override del metodo Query, avere la GetAllTodoItems metodo simile this:

public IList<TodoItem> GetAllTodoItems() 
{ 
    return context.TodoItems.Include("Numbers").ToList(); 
} 

Questa è un'alternativa all'hack $expand. L'ho scoperto mentre esploravo le app mobili di Azure App Service per me stesso. Concatenare su una chiamata Include da solo, come originariamente tentato, avrebbe più senso per me se funzionasse. Successivamente, mi piacerebbe capire perché non funziona.

Problemi correlati