如何在Azure移动服务表控制器[.Net后端]中插入多个对象

4

我有一个使用 .net Web API 编码的 Azure 移动服务。我有一个 TableController。我希望该表控制器能够插入多个人,而不仅仅是通过 InsertAsync(myPerson) 从客户端插入一个人。我在 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;
       }
  }

问题出现在客户端。因为它是强类型的,只允许我一次插入一个项目。我该如何从客户端调用服务器?我需要编写一个自定义 Api 控制器并使用 mobileService.InvokeApiAsync 调用它吗?如果是这样,那么我如何从不继承自 TableController 的自定义 API 控制器中访问我的数据库?
非常感谢!
2个回答

11
TableController<T>基类中的辅助方法假定插入操作适用于单个对象-客户端中的InsertAsync方法也假定相同。因此,即使您可以在表控制器中定义接受Person数组(或列表)的方法,您也无法通过客户端SDK调用它(至少不需要使用处理程序进行一些复杂操作)。
但是,您可以创建一个自定义API来接受这样的列表。要从API中插入多个项,您可以直接访问上下文,而无需通过表中的帮助程序。
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;
        }
    }
}

并在客户端上:

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);
    }
}

0
从Carlos Figueira在azure移动服务中一次插入多个项目的帖子中可以看出,您需要做的是创建另一个名为AllPersons的表。在客户端中,AllPersons对象将具有Persons数组成员。在AllPersons插入的服务器端脚本中,您需要遍历AllPersons.Persons并逐个插入到表中。

嗨,由于我正在使用C#代码的Web Api,因此在使用.Net后端时不允许使用脚本。 - Fritjof Berggren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接