そのため、angularJS を使用してディーラー オブジェクトをコントローラーに渡します。各ディーラー オブジェクトには、仮想 ICollection があります。HTML multiselect を使用して、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/連絡先から削除され、代わりにディーラー オブジェクトの連絡先への参照に置き換えられます。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");
});
ただし、新しい連絡先を作成してディーラーに関連付けると、このエラーは発生しません。ディーラーを連絡先ディーラーリストに追加します...しかし、連絡先をディーラーの連絡先リストに追加しません