編集およびビューを作成するマルチセレクトリストからデータを保存します
-
24-09-2019 - |
質問
私は3つのテーブルを持っています:企業、下請け、CompantoSubContract
CompantoSubContractテーブルは、会社のGUIDであり、下請けのGUIDです。サブコントラクトの編集にマルチセレクトリストがあり、ユーザーが複数の企業を選択できるビューを作成します。最終的には、下請業者の編集ビューで選択された正しい会社を表示する場所で機能しました。データの保存に問題はありません。
作成ビューでは、サブコントラクトにはSQLデータベースに書き込まれるまでGUIDがありません。それでは、GUIDをCompantoSubContractテーブルに保存するにはどうすればよいですか?
また、編集ビューでは、私は何か間違ったことをしています。それは節約しません。会社の選択。また、選択されていない企業のレコードを削除する必要があります。それをするための最良の方法は何ですか?
Nerddinnerチュートリアルに従って基本的な構造を取得しましたが、今では自分のニーズを満たすために更新しようとしています。
私を正しい方向に向けることができる人はいますか?
subcontractrepository:
public void Save()
{
db.SubmitChanges();
}
コントローラーで:
[AcceptVerbs(HttpVerbs.Post), Authorize]
public ActionResult Edit(string id, FormCollection formValues)
{
// Retrieve existing subcontract
subcontract subcontract = subcontractRepository.GetSubcontract(id);
if (subcontract == null)
return View("NotFound");
else
{
try
{
UpdateModel(subcontract);
IEnumerable<Guid> selectedCompanies = Request.Form["Companies"].Split(new Char[] { ',' }).Select(idStr => new Guid(idStr));
foreach (var item in selectedCompanies)
{
CompanyToSubcontract cs = new CompanyToSubcontract();
cs.subcontract_id = subcontract.subcontract_id;
cs.company_id = item;
subcontractRepository.Save();
}
subcontract.lastupdate_date = DateTime.Now;
subcontract.lastupdatedby_user = User.Identity.Name;
//Persist changes back to database
subcontractRepository.Save();
//Perform HTTP redirect to details page for the saved subcontract
return RedirectToAction("Details", new { id = subcontract.subcontract_no });
}
catch
{
ModelState.AddRuleViolations(subcontract.GetRuleViolations());
return View(new SubcontractFormViewModel(subcontract));
}
}
}
解決
選択したcompaniesで foreach
ループ、変更:
cs.subcontract_id = subcontract.subcontract_id;
に:
cs.subcontract = subcontract;
これが機能する理由は、私の回答で詳細に説明されています これ 質問。さらに、Linq-to-SQLは、一次キーの割り当てとその伝播も外部キーに自動的に管理します。あなたが電話するとき db.SubmitChanges()
, 、下請オブジェクトに外部キーが割り当てられていない場合、それを挿入変化として扱うことを認識します。また、下請けオブジェクトはcompantoSubContractオブジェクトに関連付けられているため、協会エンティティの外部キーフィールドを、下請けエンティティに割り当てた主要なキー値で更新することを知っています。