所以我使用angularJS将经销商对象传递给我的控制器。每个经销商对象都有一个虚拟ICollection。我使用HTML multiselect将联系人对象添加到经销商的联系人集合中,然后我将整个经销商传递给我的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对象中的Contact的引用。这很糟糕,因为我希望能够从ContactView页面显示和编辑联系人。
这就是我对rerences的意思,这里是Json的一个例子..
[
{
"$id":"1",
"dealers":[
{
"$id":"2",
"dealerg":null,
"contacts":[
{
[OMITED OBJECT DETAILS.........]
"Dealer_Id":null
},
{
"$ref":"3"
},
{
"$ref":"4"
},
{
"$ref":"5"
}
]
如果我将飞行的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");
});
但是,当我创建新联系人并与经销商相关联时,我不会收到此错误。它会将经销商添加到联系人经销商列表中......但它不会将联系人添加到经销商联系人列表