I have an Azure Mobile service coded in .net Web API. I have a TableController. I want that table controller to be able to insert multiple persons, not just one person with from the client with InsertAsync(myPerson). I have the following code in the TableController:
[RequiresAuthorization(AuthorizationLevel.Admin)]        
public async Task<bool> InsertPersons(List<Person> values)
  {
     try
      {
        foreach (var item in values)
         {                   
                var current = await InsertAsync(item);
         }
         return true;
      }
      catch (System.Exception)
       {
            return false;
       }
  }
The problem is in the client. Because it is strongly typed it only allows me to insert one item at a time. How must I call the server from the client? Do I have to write a Custom Api Controller and call it with mobileService.InvokeApiAsync? If so, how can I get access to my database from a Custom API Controller that doesn't inherit from TableController?
Thank you so much!
The helper methods in the TableController<T> base class assume that the insert operations apply to a single object - and the InsertAsync method in the client also assumes the same. So even though you can define in a table controller a method that takes an array (or list) of Person, you won't be able to call it via the client SDK (at least not without some heavy-lifting using a handler, for example).
You can, however, create a custom API which takes such a list. And to insert the multiple items from the API, you can access the context directly, without needing to go through the helper methods from the table:
public class PersonController : ApiController
{
    test20140807Context context;
    protected override void Initialize(HttpControllerContext controllerContext)
    {
        base.Initialize(controllerContext);
        this.context = new test20140807Context();
    }
    [HttpPost]
    public async Task<bool> InsertPersons(List<Person> values)
    {
        foreach (var value in values)
        {
            if (string.IsNullOrEmpty(value.Id))
            {
                value.Id = Guid.NewGuid().ToString();
            }
        }
        try
        {
            this.context.People.AddRange(values);
            await this.context.SaveChangesAsync();
            return true;
        }
        catch (System.Exception ex)
        {
            Trace.WriteLine("Error: " + ex);
            return false;
        }
    }
}
And on the client:
private async void btnTest_Click(object sender, RoutedEventArgs e)
{
    var items = new Person[]
    {
        new Person { Name = "John Doe", Age = 33 },
        new Person { Name = "Jane Roe", Age = 32 }
    };
    try
    {
        var response = await App.MobileService.InvokeApiAsync<Person[], bool>("person", items);
        Debug.WriteLine("response: " + response);
    }
    catch (Exception ex)
    {
        var str = ex.ToString();
        Debug.WriteLine(str);
    }
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With