L’associazione di un’ quadro di tipo non è riuscita poiché un’altra entity framework dello stesso tipo ha già lo stesso valore di chiave primaria.

Lasciatemi descrivere rapidamente il mio problema.

Ho 5 database per 5 clienti e ognuno ha la stessa tabella chiamata SubnetSettings .

Ho già creato un elenco a discesa per selezionare un cliente e mostrerò la tabella SubnetSetting che appartiene al cliente selezionato e mi consente di creare, modificare ed eliminare.

Posso creare, eliminare senza problemi ma quando voglio modificare i dati porta l’errore:

Errore del server nell’applicazione ‘/ TMS’.

Il collegamento di un’entity framework di tipo “CFS.Domain.Entities.SubnetSettings” non è riuscito perché un’altra quadro dello stesso tipo ha già lo stesso valore di chiave primaria. Ciò può accadere quando si utilizza il metodo “Allega” o si imposta lo stato di un’entity framework su “Non modificato” o “Modificato” se alcune quadro nel grafico hanno valori di chiavi in ​​conflitto. Ciò potrebbe essere dovuto al fatto che alcune quadro sono nuove e non hanno ancora ricevuto valori chiave generati dal database. In questo caso, utilizzare il metodo “Aggiungi” o lo stato dell’ quadro “Aggiunta” per tracciare il grafico e quindi impostare lo stato delle quadro non nuove su “Invariato” o “Modificato” a seconda dei casi.

Ecco la mia modifica nel mio controller

// GET: /SubnetSettings/Edit1/5 public ActionResult Edit1(short? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } SubnetSettings subnetsettings = detailView.SubnetSettings.SingleOrDefault(t => t.Id == id); if (subnetsettings == null) { return HttpNotFound(); } return View(subnetsettings); } // POST: /SubnetSettings/Edit1/5 [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit1([Bind(Include = "Id,Name,fDialUp,fPulse,fUseExternalGSMModem,fGsmDialUp,bUploadMethodId")] SubnetSettings subnetsettings) { if (ModelState.IsValid) { templateDb2.Save(subnetsettings); return RedirectToAction("Index"); } return View(subnetsettings); } 

Ecco il metodo di salvataggio nell’EF

  public SubnetSettings Save(SubnetSettings subnetsettings) { if (subnetsettings.Id == 0){ context.SubnetSettings.Add(subnetsettings); } else { context.SubnetSettings.Attach(subnetsettings); context.Entry(subnetsettings).State = EntityState.Modified; } context.SaveChanges(); return subnetsettings; } 

So che è difficile capire il codice degli altri. Quindi qualsiasi consiglio o suggerimento è molto grato.

Sintetizzare obiettivamente la risposta: l’object che si sta tentando di aggiornare non proviene dalla base, questo è il motivo dell’errore. L’object è venuto dal post della vista.

La soluzione è recuperare l’object dalla base, ciò renderà Entity Framework noto e gestirà l’object nel contesto. Quindi dovrai ottenere ogni valore che è cambiato da View e consistere nell’object controllato dall’ quadro.

 // POST: /SubnetSettings/Edit1/5 [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit1([Bind(Include = "Id,Name,fDialUp,fPulse,fUseExternalGSMModem,fGsmDialUp,bUploadMethodId")] SubnetSettings subnetsettings) { if (ModelState.IsValid) { //Retrieve from base by id SubnetSettings objFromBase = templateDb2.GetById(subnetsettings.Id); //This will put all attributes of subnetsettings in objFromBase FunctionConsist(objFromBase, subnetsettings) templateDb2.Save(objFromBase); //templateDb2.Save(subnetsettings); return RedirectToAction("Index"); } return View(subnetsettings); } 

Per rimuovere l’errore, ho utilizzato AutoMapper per copiare l’object del modello di visualizzazione nell’object di base, prima di Aggiornamento.

 Category categoryFromBase = Repository.GetById(categoryFromViewModel.Id); Mapper.CreateMap(); Mapper.Map(categoryFromViewModel, categoryFromBase); Repository.Save(categoryFromBase); 

Non sono sicuro che la seguente riga stia facendo ciò che intendi:

 Mapper.Map(categoryFromViewModel, categoryFromBase); 

Penso che quanto segue sia ciò che desideri:

 Category categoryFromBase = Mapper.Map(categoryFromViewModel)