2013-01-01 7 views
5

Ho definito una classe nel mio progetto di dominio (poco?):pigro carico non funziona in Entity Framework 5

public class Club 
{ 
    public Club() 
    { 
     ContactPersons = new HashSet<ContactPerson>(); 
    } 

    public int Id { get; set; } 

    [Required] 
    [StringLength(64)] 
    public string Name { get; set; } 

    public virtual ICollection<ContactPerson> ContactPersons { get; set; } 
} 

public class ContactPerson 
{ 
    public virtual int Id { get; set; } 

    [StringLength(64)] 
    public virtual string FirstName { get; set; } 

    [StringLength(64)] 
    public virtual string LastName { get; set; } 
} 

Nel mio progetto MVC ho il mio clubcontroller:

public ActionResult Create(CreateClubViewModel model) 
    { 
     Club club = new Club(); 
     model.Initialize(club); 
     IClubDb clubDb = DependencyResolverHelper.IClubDbService; 
     clubDb.Create(club); // create club in db 
    } 

    public ActionResult Display(string domain) 
    { 
     try 
     { 
      IClubDb clubDb = DependencyResolverHelper.IClubDbService; 
      Club club = clubDb.Get(domain); 
      return View(club); 
     } 
     catch (Exception) // user is not logged iin 
     { 
      return View(); 
     } 
    } 

Infine , nel mio progetto DB creo e recuperare il club,

public Club Get(string name) 
{ 
    return DataContext.Clubs 
    //.Include(x => x.ContactPersons) 
    .Single(r => r.Name == name); 
} 

public int Create(Club club) 
{ 
     DataContext.Clubs.Add(club); 
     return DataContext.SaveChanges(); 
} 

ho provato di tutto per arrivare EF a carico pigri i ContactPersons di m y oggetto del club quando chiamo Get club nel metodo Display ma ContactPersons ha sempre una lunghezza pari a zero. Tuttavia, se desidero caricare le persone di contatto usando l'inclusione (ho commentato questa parte), ovviamente ContactPersons contiene un numero di contatti.

Non sono sicuro di quello che sto facendo male:

  1. ho seguito le linee guida per la definizione di classi Poco: http://msdn.microsoft.com/en-us/library/dd468057.aspx
  2. Ho un parametro di pubblico meno costruttore (ma non protetta costruttore)
  3. Ho abilitato lazyloading

Penso che mi manca un concetto, la classe club poco è anche la mia entità di dominio che inserisco in DB. Che cosa sto facendo di sbagliato? Whay Non riesco a scaricare pigro al lavoro?

+0

Provare a utilizzare un 'Elenco ' invece di un 'ICollection '. Non credo che EF sia abbastanza intelligente da usare il Dominic di ICollection –

+0

, ho appena provato il tuo suggerimento, sempre lo stesso, ContactPersons è vuoto :( – user1780105

+0

@Dominic: 'ICollection ' funziona abbastanza bene, ha anche più senso da una lista 'implica un ordine e le entità correlate non vengono restituite in alcun ordine particolare –

risposta

0

La tua LazyLoading esegue quando il DbContext è chiuso. Quindi non verrà caricato. In contatto con ContactPerson, ho ragione?

+0

Sì, accedo al club in modalità Visualizza (club). Ma ho provato ad accedere alla persona di contatto prima della linea "return view (club") ed era lo stesso. Ho anche provato ad accedere alla persona di contatto quando ricevo il club all'interno del progetto DB e non è stato caricato. – user1780105

+0

Quando utilizzo il debugger, il tipo di ContactPerson non viene modificato. Ricordo vagamente che EF crea un nuovo tipo e inserisce un gancio nella funzione accessor getter. Sembra che EF non stia creando oggetti proxy, quindi il caricamento lento fallisce. Ho le seguenti righe nel mio codice: this.Configuration.LazyLoadingEnabled = true; this.Configuration.ProxyCreationEnabled = true; – user1780105

0

Hai dimenticato di includere la chiave esterna nella tua entità?

public class ContactPerson 
{ 
    public virtual int Id { get; set; } 

    [StringLength(64)] 
    public virtual string FirstName { get; set; } 

    [StringLength(64)] 
    public virtual string LastName { get; set; } 

    public int ClubId { get; set; } 
    [ForeignKey("ClubId")] 
    public virtual Club Club { get; set; } // if you need 
} 
1

Forse puoi trovare chiarimenti su Lazy Loading in questi due link:

questa mostra come impostare lazy loading la parola virtual http://social.msdn.microsoft.com/Forums/en-US/2fa08c8f-b8c4-475f-8834-d6c903463ede/disable-lazy-loading-for-navigation-properties-on-entities-in-ef-5

questa mostra un esempio di utilizzo di lazy loading http://blog.staticvoid.co.nz/2012/7/17/entity_framework-navigation_property_basics_with_code_first

+0

1 downvote perché il tuo primo collegamento è un collegamento alla documentazione di Microsoft. un altro downvote perché il tuo secondo link non mostra nulla sul caricamento pigro – user275801