Domanda

Ho 3 tabelle: aziende, subappalti e societàTosubContract

La tabella aziendaleTosubContract è il GUID dell'azienda e GUID del subappalto. Ho un MultiSelectList sulla modifica del subappalto e creare viste in cui l'utente può selezionare più aziende. Finalmente l'ho fatto funzionare dove visualizza le aziende corrette come selezionate nella vista Modifica del subappalto. Non ho un problema con il salvataggio dei dati.

Nella vista Crea, il subappalto non ha un GUID fino a quando non è scritto nel database SQL, quindi come posso far salvare il GUID nella tabella aziendaletosubContract?

Inoltre, nella vista di modifica, sto facendo qualcosa di sbagliato. Non salva. Le selezioni dell'azienda. Devo anche eliminare i record per le aziende non selezionate. Qual è il modo migliore per farlo?

Ho seguito il tutorial Nerddinner per ottenere la mia struttura di base e ora sto cercando di aggiornare per soddisfare le mie esigenze.

Chiunque possa indicarmi nella giusta direzione?

In subcontractrepository:

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

In controller:

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

        }
    }
È stato utile?

Soluzione

Nelle commissioni selezionate foreach Loop, modifica:

cs.subcontract_id = subcontract.subcontract_id;

a:

cs.subcontract = subcontract;

Il motivo per cui questo funziona è spiegato in dettaglio nella mia risposta a questo domanda. Inoltre, LinQ-a-SQL gestisce anche l'assegnazione delle chiavi primarie e la loro propagazione alle chiavi straniere automaticamente. Quando chiami db.SubmitChanges(), riconosce che se l'oggetto subappalto non ha una chiave esterna assegnata, la tratta come una modifica di inserimento. Inoltre, poiché l'oggetto subappalto viene associato a un oggetto aziendaleTosubContract, sa di aggiornare il campo chiave estero nell'entità dell'associazione con il valore chiave primario che ha appena assegnato all'entità del subappalto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top