"POCO" è un termine vago nello spazio ORM. La gente variamente usano per significare:
- "Pure" pocos, che non fanno rilevamento delle modifiche, lazy loading, hanno proprietà private, ecc Essi può essere difficile con cui lavorare.
- Proxy Psuedo-POCO: i tipi con tutto
public virtual
e che hanno tipi diversi in fase di esecuzione.
- Entità di tracciamento automatico. Non POCOs, ma non
EntityObject
neanche.
Trovo che la definizione "non dipendente da un quadro esterno" sia alquanto autonoma. È un modo per ignorare i limiti di un quadro. Ad esempio, i proxy non sono veri POCO nel mio libro, ma soddisfano questa definizione.
Cosa c'è che non va con EntityObject
? Non molto. È abbastanza leggero e fa parte di .NET. È anche nel profilo del client .NET 4. Non ti lega nemmeno all'EF. Anche se sarebbe un po 'strano utilizzarlo come un "tipo POCO" con un framework diverso, funzionerebbe perfettamente. Non è in Silverlight, però, IIRC.
Le entità POCO sono più difficili da utilizzare, perché si perdono le cose che EntityObject
fornisce gratuitamente. Non è molto, ma qualcosa da considerare prima di scegliere POCO solo perché "sono fantastici", specialmente per chi è nuovo all'EF.
Una cosa che molte persone che si fanno religiose sui POCO tendono a ignorare: la mappatura di tipi non POCO non limita in alcun modo l'esposizione esterna di quei tipi non POCO. I vostri servizi dati in grado di proiettare mappato tipi non-poco sopra non mappati POCO DTOs e si può scegliere di esporre solo i tipi, vale a dire:
public IEnumerable<FooDto> IFooRepository.SelectAll()
{
return from f in Context.Foos
select new FooDto { Id = f.Id, Name = f.Name };
}
Così mappatura tipi e tipi di servizio dati possono essere facilmente diverse preoccupazioni, se lo si vuole .
Quando è necessario assolutamente non- EntityObject
tipi di mapping? Bene, se hai bisogno di entità di auto-tracciamento, allora è un caso aperto e chiuso. Se devi esporre i tuoi tipi mappati a Silverlight, chiaramente anche allora.
Oltre a ciò è meno chiaro. Se stai scrivendo un servizio dati per il consumo pubblico, non dovresti fare in modo che i DTO siano sottotipi EntityObject
, perché ciò impedirebbe di collegare un altro framework in seguito. Non renderei mai un'interfaccia pubblica immutabile dipendente da alcun framework, nemmeno uno incluso in .NET. D'altra parte, come ho detto sopra, puoi esporre un tipo e mapparne un altro; non è necessario esporre tipi mappati, mai, e spesso ottime ragioni per non esporli (forse contengono dati non pubblici).
Mi piacerebbe aggiungere che ho usato POCO ora principalmente solo così posso aggiungere DataAnnotations alle mie proprietà, qualcosa che non penso sarebbe opportuno fare nel file di progettazione EF in quanto potrebbero essere sommersi quando aggiornato. Anche se probabilmente dovrei usarli sui miei modelli View, è più semplice per la maggior parte delle mie esigenze aggiungerli direttamente sui POCO. – JasperLamarCrabb
@CannibalCorpse: le classi EF sono parziali e non è necessario modificare il codice generato automaticamente. Non c'è alcun problema con l'utilizzo di DataAnnotations con EF, devi solo usare le classi di metadati. – LukLed