Pergunta

Eu tenho 3 tabelas: empresas, subcontratos e CompanyToSubContrated

A tabela CompanyToSubContract é o GUID da empresa e o GUID do subcontrato. Eu tenho uma lista multisselect na edição de subcontratação e criar visualizações em que o usuário pode selecionar várias empresas. Finalmente consegui funcionar, onde exibe as empresas corretas, conforme selecionado na visualização de edição de subcontratos. Não estou tendo um problema em salvar os dados.

Na exibição Create, o subcontrato não possui um GUID até que seja escrito no banco de dados SQL, então como posso obter o GUID para salvar na tabela CompanyToSubContract?

Além disso, na visão de edição, estou fazendo algo errado. Não economiza. As seleções da empresa. Eu também preciso excluir registros para empresas que não são selecionadas. Qual é a melhor maneira de fazer isso?

Eu segui o tutorial Nerddinner para obter minha estrutura básica e agora estou tentando atualizar para atender às minhas necessidades.

Quem pode me apontar na direção certa?

No subcontractrepository:

public void Save()
    {
        db.SubmitChanges();
    }

No controlador:

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

        }
    }
Foi útil?

Solução

Nas empresas selecionadas foreach Loop, mudança:

cs.subcontract_id = subcontract.subcontract_id;

para:

cs.subcontract = subcontract;

A razão pela qual isso funciona é explicado em detalhes em minha resposta a isto pergunta. Além disso, o LINQ-para-SQL também gerencia a atribuição de chaves primárias e sua propagação às chaves estrangeiras automaticamente. Quando Você ligar db.SubmitChanges(), reconhece que, se o objeto de subcontrato não tiver uma chave estrangeira atribuída, ele o trata como uma alteração de inserção. Além disso, como o objeto de subcontrato está sendo associado a um objeto CompanyToSubContract, ele sabe atualizar o campo de chave estrangeira na entidade da associação com o valor principal da chave que acabou de atribuir à entidade do subcontrato.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top