質問

私は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オブジェクトに関連付けられているため、協会エンティティの外部キーフィールドを、下請けエンティティに割り当てた主要なキー値で更新することを知っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top