所以我使用 angularJS 将经销商对象传递给我的控制器。每个经销商对象都有一个虚拟 ICollection。我使用 HTML 多选将联系人对象添加到 Dealer 中的联系人集合中,然后将整个经销商传递到我的 C# 控制器中。
这是控制器的代码
public HttpResponseMessage PostDealer(Dealer dealer)
{
if (ModelState.IsValid)
{
var contacts = dealer.contacts;
db.Dealers.Add(dealer);
if (dealer.contacts != null)
{
foreach (var contact in dealer.contacts)
{
db.Contacts.Attach(contact);
}
}
db.SaveChanges();
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, dealer);
response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = dealer.Id }));
return response;
}
else
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
}
这就是建立关系的方式
modelBuilder.Entity<Dealer>().HasMany(u => u.contacts)
.WithMany(d => d.dealers)
.Map(m =>
{
m.ToTable("ContactMap");
m.MapLeftKey("DealerId");
m.MapRightKey("Contact_Id");
});
当我这样做时,每个联系人对象都会从我的 api/contacts 中删除,而是替换为对 Dealer 对象中的联系人的引用。这很糟糕,因为我希望能够从 ContactView 页面显示和编辑联系人。
编辑
这就是我所说的参考,这是 Json 的一个示例部分。
[
{
"$id":"1",
"dealers":[
{
"$id":"2",
"dealerg":null,
"contacts":[
{
[OMITED OBJECT DETAILS.........]
"Dealer_Id":null
},
{
"$ref":"3"
},
{
"$ref":"4"
},
{
"$ref":"5"
}
]
编辑
如果我将 flent api 映射更改为
modelBuilder.Entity<Dealer>().HasMany(u => u.contacts)
.WithMany(##removed this piece of code##)
.Map(m =>
{
m.ToTable("ContactMap");
m.MapLeftKey("DealerId");
m.MapRightKey("Contact_Id");
});
但是,当我创建新联系人并与经销商关联时,我没有收到此错误。它会将经销商添加到联系人经销商列表中......但它不会将联系人添加到经销商联系人列表中