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.

È stato utile?

Soluzione

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