2010-09-07 9 views
6

Utilizzo di Entity framework v4 e dei modelli T4 del generatore di entità POCO.Arresta EF dal caricamento delle entità quando si assegna l'associazione

Il problema è che i metodi di correzione caricano centinaia di entità quando si assegna un'entità associata (vedere la riga 4 di seguito).

Dim context = New SomeEntities 
Dim list = context.Lists.FirstOrDefault(Function(l) l.ListId = 2) 
Dim queryDetail = context.CreateObject(Of QueryDetail)() 
queryDetail.CriteriaColumnType = context.CriteriaColumnTypes.FirstOrDefault(Function(cct) cct.CriteriaColumnTypeId = 145) 

Il CriteriaColumnType entità che viene assegnato ha una collezione di oggetti QueryDetail, e quando l'assegnazione, il metodo di correzione sull'entità CriteriaColumnType è caricamento lazy tutti gli associati QueryDetails.

Come posso creare l'associazione FK e fissare l'entità CriteriaColumnType alla mia QueryDetail entità senza caricare tutti i CriteriaColumnType'sQueryDetail record?

+0

Per chiarire, si dispone di un 'QueryDetail' con una proprietà denominata' CriteriaColumnType' che contiene una raccolta di altri 'QueryDetail's. –

risposta

1

Avete bisogno di caricare pigro qui? È possibile disattivarlo:

context.ContextOptions.LazyLoadingEnabled = false 
+1

In realtà ho pensato di usarlo, ma mi sembra un trucco. Sembra difficile credere che l'utente casuale di Enitity Framework vorrebbe davvero che l'intera collezione dell'entità associata venga caricata in questo caso! –

+1

Non penso che sia hacky. Il contesto è un'unità di lavoro. Non tutti gli UOW richiedono un caricamento lento. Non deve influire su altri UOW, che potrebbero richiedere un caricamento lento. –

+1

Sono d'accordo con Steve. Se l'unico modo per evitare questo comportamento è disattivare il caricamento lento, dovrebbe essere considerato come un bug. L'unico motivo per questo problema è il rilevamento delle modifiche (proprietà di navigazione di FixUp su entrambi i lati dell'associazione). Il codice assegna valore alla proprietà di navigazione su un lato. A sua volta, desidera assegnare il valore alla raccolta di navigazione sull'altro lato ma, a causa dell'accesso alla raccolta, avvia il caricamento lento. –

1

Ho incontrato anche questo problema. Un'operazione che richiedeva millisecondi ha iniziato a scattare 3-4 secondi, tutto perché ho aggiunto una proprietà di navigazione che punta a una tabella di grandi dimensioni.

Ho risolto il problema eliminando tutto il codice di correzione dal modello T4 - il nostro progetto non ha comunque bisogno di quella funzionalità. Ho eliminato tutto da questa riga:

region.Begin("Association Fixup"); 

alla successiva chiamata region.End(). Ho anche eliminato tutte le chiamate ai metodi di correzione dai setter della proprietà, la registrazione dei gestori di CollectionChanged e il flag _settingFK.


Vedere questa domanda per ulteriori informazioni sul perché il codice di correzione è presente: Why is "Fixup" needed for Persistence Ignorant POCO's in EF 4?. Sta cercando di essere sicuro che se si modifica un'estremità di un'associazione bidirezionale, anche l'altra estremità viene aggiornata. Pertanto, ad esempio, se crei un nuovo BlogPost e ne imposti la proprietà User a un utente, la logica di correzione aggiungerà automaticamente il post alla raccolta Posts dell'utente.

marc_s ha risposto all'altra domanda collegando POCO Template Code Generation Options. La rimozione del codice di correzione dal modello T4 modifica il modello dal n. 2 (POCO di base con correzione) al n. 1 (POCO di base senza correzione).

Problemi correlati