Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to insert multiple objects in to Azure Mobile Services table controller [.Net backend]

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!

like image 579
Fritjof Berggren Avatar asked Dec 20 '22 11:12

Fritjof Berggren


1 Answers

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);
    }
}
like image 119
carlosfigueira Avatar answered May 10 '23 05:05

carlosfigueira