我有一个以.net Web Api编码的Azure Mobile服务。我有一个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继承的Custom Api Controller访问我的数据库?
非常感谢你!
答案 0 :(得分:10)
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);
}
}
答案 1 :(得分:0)
来自inserting multiple items at once in azure mobile services的Carlos Figueira的帖子,看起来你需要做的是创建另一个名为AllPersons的表。在您的客户端中,AllPersons对象将具有Persons数组成员。在AllPersons插入的服务器端脚本中,迭代AllPersons.Persons并逐个插入表中。