1

私は3つのテーブルを持っています:Companies、Subcontracts、CompanyToSubcontract

CompanyToSubcontractテーブルは、会社のGUIDおよび下請けのGUIDです。下請けの編集ビューと作成ビューにMultiSelectListがあり、ユーザーは複数の会社を選択できます。私はついにそれが機能するようになり、下請け編集ビューで選択された正しい会社が表示されます。データの保存に問題はありません。

作成ビューでは、下請け契約にはSqlデータベースに書き込まれるまでGUIDがありません。そのため、どのようにしてGUIDをCompanyToSubcontractテーブルに保存できますか?

また、編集ビューで、私は何か間違ったことをしています。それは保存されません。会社の選択。選択されていない会社のレコードも削除する必要があります。それを行うための最良の方法は何ですか?

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));
            }

        }
    }
4

1 に答える 1

1

selectedCompaniesforeachループで、以下を変更します。

cs.subcontract_id = subcontract.subcontract_id;

に:

cs.subcontract = subcontract;

これが機能する理由は、この質問への私の回答で詳細に説明されています。さらに、LINQ-to-SQLは、主キーの割り当てと外部キーへのそれらの伝播も自動的に管理します。を呼び出すとdb.SubmitChanges()、外注オブジェクトに外部キーが割り当てられていない場合、それがINSERT変更として扱われることを認識します。また、下請けオブジェクトはCompanyToSubcontractオブジェクトに関連付けられているため、下請けエンティティに割り当てたばかりの主キー値で、関連付けエンティティの外部キーフィールドを更新することを認識しています。

于 2010-02-01T22:34:40.877 に答える