Sono bloccato in un punto in cui il mio codice lancia un'eccezione a:
dbContext.Entry(entity).State = EntityState.Modified;
Sto usando questo codice dal mese scorso ma questa eccezione aumenta solo due giorni fa. Ho letto molti thread ma nessuno mi avvantaggia. Il problema è quando si tenta di aggiornare il record esistente visualizzato sempre sotto indicato errore:
Il collegamento di un'entità di tipo "X" non è riuscito perché un'altra entità 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'entità su "Non modificato" o "Modificato" se alcune entità nel grafico hanno valori di chiavi in conflitto. Ciò potrebbe essere dovuto al fatto che alcune entità sono nuove e non hanno ancora ricevuto valori chiave generati dal database. In questo caso, utilizzare il metodo "Aggiungi" o lo stato dell'entità "Aggiunta" per tracciare il grafico e quindi impostare lo stato delle entità non nuove su "Invariato" o "Modificato" a seconda dei casi.
Ho usato il seguente codice:
{
if (unitOfWork.AddressRepository.DataSet.Where(x => x.AddressId == item.AddressId).ToList().Count() > 0)
unitOfWork.AddressRepository.Update(item);
else
unitOfWork.AddressRepository.Create(item);
}
public virtual void Update(T entity)
{
dbContext.Entry(entity).State = EntityState.Modified;
}
A scopo di test ho anche fatto un esperimento con il metodo " Update ".
try
{
dbContext.Entry(entity).State = EntityState.Modified;
}
catch (Exception ex)
{
Create(entity);
}
public virtual void Create(T entity)
{
dbSet.Add(entity);
}
//constructor taking the database context and getting the appropriately typed data set from it
public Repository(DBEntities context)
{
dbContext = context;
dbSet = context.Set<T>();
}
Ho riempito il mio dbContext nel costruttore. Quindi ottengo sempre dbContext all'inizio.
Ogni volta che viene eseguito il metodo Create (entità) che crea un nuovo record. Quando ho controllato nel database, i record vengono duplicati.
Dopo due giorni, ho finalmente ottenuto la soluzione che voglio condividere per aiutare gli altri.
In realtà, ho usato web apis per ricevere dati dal client, riempire il modello quindi chiamare entity.modified. Ma il framework di entità aggiorna solo il suo attuale dbContext. Quindi, in un primo momento, ottengo particolari dati da dbContext, quindi aggiorno quell'oggetto particolare tramite " AutoMapper ". Dato sotto il codice spiega tutto.
{
//--get particular data from dbContext
var _address = unitOfWork.AddressRepository.GetById(address.AddressId);
Mapper.CreateMap<Data.Concrete.Address, Data.Concrete.Address>();
//--update that particular object via autoMapper
var _customAddress = Mapper.Map<Address, Address>(address, _address);
if (unitOfWork.AddressRepository.DataSet.Where(x => x.AddressId == address.AddressId).ToList().Count() > 0)
unitOfWork.AddressRepository.Update(_customAddress);
else
unitOfWork.AddressRepository.Create(address);
}