In modo efficiente Determinare se EF 4 POCO Già nel ObjectSet
-
24-10-2019 - |
Domanda
sto cercando EF 4 con POCO di su un piccolo progetto per la prima volta. Nella mia implementazione Repository, voglio fornire un metodo AddOrUpdate che aggiungerà un nulla di passato-in POCO al repository se si tratta di nuovo, altrimenti fare (come verrà salvato l'aggiornamento POCO quando SaveChanges si chiama).
Il mio primo pensiero è stato quello di fare questo:
public void AddOrUpdate(Poco p)
{
if (!Ctx.Pocos.Contains<Poco>(p))
{
Ctx.Pocos.AddObject(p);
}
}
Tuttavia, che si traduce in una NotSupportedException
come documentato sotto Referencing non scalari supportato (domanda bonus: perché vorrei che non può essere supportato)
Basta rimuovere la parte Contains
e sempre chiamando risultati AddObject in un InvalidStateException
:
Un oggetto con la stessa chiave già esiste nella ObjectStateManager. Il oggetto esistente è nel immutato stato. Un oggetto può essere aggiunto solo agli l'ObjectStateManager di nuovo se si tratta di nello stato aggiunto.
Quindi, chiaramente EF 4 sa da qualche parte che questo è un duplicato in base alla chiave.
Qual è un modo pulito, efficiente per il repository di aggiornare Pocos sia per un nuovo o di un oggetto pre-esistente quando AddOrUpdate viene chiamato in modo tale che la successiva chiamata a SaveChanges () farà la cosa giusta?
I ha ritenuto che trasporta una bandiera isNew sull'oggetto stesso, ma sto cercando di prendere la persistenza ignoranza per quanto pratica.
Soluzione
Provate a guardare ObjectStateManager.TryGetObjectStateEntry metodo , è bene descritto nella questo StackOverflow queston .