2011-09-23 7 views
6

Ho questa classelazy loading non funziona quando in nuovi oggetti salvati, (quando inducendole dal contesto che li ha salvati)

public class Comment 
{  
    public long Id { get; set; } 
    public string Body { get; set; } 
    public long OwnerId { get; set; } 
    public virtual Account Owner { get; set; } 
    public DateTime CreationDate { get; set; } 
} 

il problema è che il proprietario proprietà virtuale è che ottengo null object reference exception quando si fa :

comment.Owner.Name 

quando si chiama questo diritto dopo che l'oggetto è stato salvato (dalla stessa istanza di DbContext) con un nuovo contesto lavorerà

un qualcuno sa qualcosa di questo?

risposta

18

Questo perché è stato creato Comment con il costruttore. Ciò significa che l'istanza Comment non è proxy e non può utilizzare il caricamento lazy. È necessario utilizzare Create metodo su DbSet invece per ottenere un'istanza di Proxied Comment:

var comment = context.Comments.Create(); 
// fill comment 
context.Comments.Add(comment); 
context.SaveChanges(); 
string name = comment.Owner.Name; // Now it should work because comment instance is proxied 
+0

Grazie per questo, molto conciso e al punto! –

+1

Per chiunque altro cerchi di non farlo, ma usa MVC Binder (che utilizza il costruttore predefinito), puoi fare riferimento esplicitamente in questo modo: context.Entry (comment) .Reference (x => x .Owner) .load(); –

+0

m.t.bennett: è stato molto utile, grazie per il tuo commento. –