【发布时间】:2016-08-24 13:30:15
【问题描述】:
我需要使用 Azure 应用服务的 1:n 关系。 I followed this tutorial 用于实体。
我的客户端实体(与教程相同,除了我添加了一个构造函数):
public abstract class Entity {
// defines id, version, createdAt, updatedAt, deleted
}
public class Animal : Entity {
public string Name { get; set; }
}
public class Zoo : Entity {
public Zoo() { Animals = new List<Animal>(); }
public string Name { get; set; }
public List<Animal> Animals { get; set; }
}
我的服务器实体(与教程相同,除了我添加了一个构造函数):
public class Animal : EntityData {
public string Name { get; set; }
}
public class Zoo : EntityData {
public Zoo() { Animals = new List<Animal>(); }
public string Name { get; set; }
public virtual ICollection<Animal> Animals { get; set; }
}
ZooController 表控制器(库存脚手架代码,除了我添加了属性):
[HttpPatch]
public Task<Zoo> PatchZoo(string id, Delta<Zoo> patch) {
return UpdateAsync(id, patch);
}
[HttpPost]
public async Task<IHttpActionResult> PostZoo(Zoo item) {
Zoo current = await InsertAsync(item);
return CreatedAtRoute("Tables", new { id = current.Id }, current);
}
Animal 有一个类似的表控制器。
现在解决问题。我从客户端执行插入和更新:
// create animal (child)
var animal = new Animal() { Name = "Dumbo" };
await animalTable.InsertAsync(animal);
// create zoo (parent)
var zoo = new Zoo() { Name = "Tokyo National Zoo" };
await zooTable.InsertAsync(zoo);
// add animal to zoo
zoo.Animals.Add(animal);
await zooTable.UpdateAsync(zoo);
// push
await zooTable.MobileServiceClient.SyncContext.PushAsync();
这会引发异常。在服务器上,它以StatusCode: 409, ReasonPhrase: 'Conflict' 抛出,在客户端它以"The operation failed due to a conflict: 'Violation of PRIMARY KEY constraint 'PK_dbo.Animals'. Cannot insert duplicate key in object 'dbo.Animals' 抛出。基本上,服务器说我试图插入相同的Animal 记录两次。
我做错了什么?
【问题讨论】:
-
我做了一些调试,注意到
Animal控制器的POST方法被调用,然后Zoo控制器的POST方法被调用。所以第二个 POST 操作是发生双插入的地方。但是我该如何阻止呢? -
你试过省略animalTable.InsertAsync()吗?只是我的一个想法。
标签: c# entity-framework azure azure-mobile-services