Sto usando il codice EF prima per sviluppare la mia applicazione WinForm a 3 strati, ho usato disconnesso POCO
s come entità modello. Tutte le mie entità ereditate dalla classe BaseEntity
.Trovare le entità con la stessa chiave in un oggetto grafico per impedire "Un oggetto con la stessa chiave esiste già nell'ObjectStateManager" Errore
ho usato scollegati POCO
s, così ho gestire entità di State
sul lato client, e in ApplyChanges()
metodo, allegare il mio grafico entità (ad esempio un Order
con la sua OrderLines
e Products
) al mio DbContext
e poi sincronizzare di State
con la sua ogni entità lato client State
.
public class BaseEntity
{
int _dataBaseId = -1;
public virtual int DataBaseId // DataBaseId override in each entity to return it's key
{
get { return _dataBaseId; }
}
public States State { get; set; }
public enum States
{
Unchanged,
Added,
Modified,
Deleted
}
}
Così, quando voglio salvare un grafico degli enti collegati, ho usato metodi seguenti:
public static EntityState ConvertState(BaseEntity.States state)
{
switch (state)
{
case BaseEntity.States.Added:
return EntityState.Added;
case BaseEntity.States.Modified:
return EntityState.Modified;
case BaseEntity.States.Deleted:
return EntityState.Deleted;
default:
return EntityState.Unchanged;
}
}
public void ApplyChanges<TEntity>(TEntity root) where TEntity : BaseEntity
{
_dbContext.Set<TEntity>().Add(root);
foreach (var entry in _dbContext.ChangeTracker
.Entries<BaseEntity>())
{
BaseEntity stateInfo = entry.Entity;
entry.State = ConvertState(stateInfo.State);
}
}
Ma se il mio grafico contiene 2 o più entità con la stessa chiave do questo errore:
An object with the same key already exists in the ObjectStateManager...
Come posso rilevare le entità con le stesse chiavi nel mio grafico (root
) e li rendono unici nel mio metodo ApplyChanges()
?
Come si "passa un grafico"? E perché le tue entità implementano 'INotifyPropertyChanged'? –
l'oggetto radice è il grafico di TEntities, io implemento INotifyPropertyChanged per poter legare oggetti a winUI. – Masoud
@Masoud È lo stesso valore di 'ID' -1? Forse hai solo bisogno di segnare correttamente gli elementi da aggiungere invece di aggiornare o qualcosa di così semplice. Il fatto che tu abbia una collisione di ID non è necessariamente una preoccupazione di EF, sembra che tu stia facendo un sacco di cose al di fuori di EF. –