2010-06-13 13 views
6

Ho una gerarchia di oggetti piuttosto profonda che sto cercando di mantenere con Entity Framework 4, POCO, PI (Persistence Ignorance) e Code First. All'improvviso le cose hanno iniziato a funzionare abbastanza bene quando mi sono reso conto di non usare l'operatore new(). Come originariamente scritto, gli oggetti usano frequentemente new() per creare oggetti figlio.Entity Framework 4 Code First e il nuovo() Operator

Invece sto usando il mio Take sul modello di repository per creare tutti gli oggetti figlio secondo necessità. Ad esempio, dato:

class Adam 
{ 
    List<Child> children; 
    void AddChildGivenInput(string input) { children.Add(new Child(...)); } 
} 

class Child 
{ 
    List<GrandChild> grandchildren; 
    void AddGrandChildGivenInput(string input) { grandchildren.Add(new GrandChild(...)); } 
} 

class GrandChild 
{ 
} 

("GivenInput" implica una certa elaborazione non mostrato qui)

definisco un AdamRepository come:

class AdamRepository 
{ 
    Adam Add() 
    { 
     return objectContext.Create<Adam>(); 
    } 
    Child AddChildGivenInput(Adam adam, string input) 
    { 
     return adam.children.Add(new Child(...)); 
    } 
    GrandChild AddGrandchildGivenInput(Child child, string input) 
    { 
     return child.grandchildren.Add(new GrandChild(...)); 
    } 
} 

Ora, questo funziona abbastanza bene. Tuttavia, non sono più "ignorante" del mio meccanismo di persistenza poiché ho abbandonato l'operatore new().

Inoltre, sono a rischio di un anemic domain model poiché tanta logica finisce nel repository piuttosto che negli oggetti del dominio.

Dopo molte esitazioni, una domanda:

O meglio alcune domande ...

  • È questo il modello che devono lavorare con EF 4 Codice Prima?
  • C'è un modo per conservare l'uso di new() e funzionano ancora con EF 4/POCO/Code First?
  • Esiste un altro schema che lascerebbe la logica nell'oggetto dominio e funzioni ancora con EF 4/POCO/Code First?
  • Questa restrizione verrà revocata nelle versioni successive del supporto Code First?

A volte cercando di andare il POCO/ Persistenza percorso ignoranza si sente come nuoto controcorrente, altre volte ci si sente come nuotare fino cascate del Niagara. Eppure, io voglio credere ...

risposta

4

Qui ci sono un paio di punti che potrebbero aiutare a rispondere alla tua domanda:

nelle classi si dispone di un campo per la raccolta i bambini e un metodo per aggiungere ai bambini . EF in generale (non solo Code First) richiede attualmente che le collezioni siano di superficie come proprietà, quindi questo pattern non è attualmente supportato. Più flessibilità nel modo in cui interagiamo con le classi è una domanda comune per EF e il nostro team sta valutando come supportarlo al momento

Hai detto che è necessario registrare esplicitamente entità con il contesto, questo non è necessariamente il caso. Nell'esempio seguente, se GetAdam() ha restituito un oggetto Adam collegato al contesto sottostante, il nuovo figlio Caino verrà automaticamente rilevato da EF quando viene salvato e inserito nel database.

var adam = myAdamRepository.GetAdam();

var cain = new Child();

adam.Children.Aggiungere (Cain);

~ Rowan

+0

Benvenuti in Stack Overflow. Il problema fondamentale è che ho davvero una gerarchia di oggetti profondi, in cui ogni livello sa come creare istanze di oggetti del livello successivo. La mia comprensione ed esperienza è che dovrei camminare manualmente la mia gerarchia di oggetti per collegare tutti gli oggetti individualmente a un ObjectContext prima che possano essere mantenuti. La mia applicazione è abbastanza complessa, ma cercherò di distillarla in un semplice esempio completo. Non accadrà oggi però, si spera domani. –

+1

@Eric J, non è quello che ho capito dalla risposta di Rowan. A me sembra che "Se aggiungi qualcosa alla raccolta pubblica di oggetti correlati, EF memorizzerà automaticamente quell'entità anche se non l'hai aggiunta esplicitamente all'ObjectContext". Questo è coerente con il comportamento di LINQ to SQL. –

Problemi correlati