2013-01-01 19 views
5

Mam zdefiniowane klasy w moim projekcie domeny (poco?):Lazy ładowanie nie działa w ramach podmiotu 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; } 
} 

W moim projekcie MVC Mam 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(); 
     } 
    } 

Finally w moim projekcie DB utworzyć i pobrać klub,

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(); 
} 

próbowałem wszystkiego, aby uzyskać EF do leniwego obciążenia na ContactPersons m y obiekt klubowy, gdy wywołuję Get Club w metodzie Display, ale ContactPersons ma zawsze długość zero. Jednakże, jeśli mam ochotę załadować osoby kontaktowe za pomocą .include (skomentowałem tę część), to oczywiście ContactPersons zawiera pewną liczbę kontaktów.

Nie jestem pewien, co robię źle:

  1. Śledzę wytyczne dla określenia POCO klasy: http://msdn.microsoft.com/en-us/library/dd468057.aspx
  2. mam parametr publiczny mniej konstruktora (ale nie chronione konstruktora)
  3. Mam włączone lazyloading

Myślę, że brakuje mi koncepcji, klasa klubowa poco jest również moją domeną, którą wstawiam do DB. Co ja robię źle? Do kogo nie mogę się lenić ładując do pracy?

+0

Spróbuj użyć "Listy " zamiast "ICollection ". Nie sądzę, że EF jest na tyle sprytny, aby używać Dominiki, ICollection –

+0

, po prostu wypróbowałem twoją sugestię, wciąż to samo, ContactPersons jest puste :( – user1780105

+0

@Dominic: 'ICollection ' działa całkiem dobrze.To ma więcej sensu od czasu 'List 'implikuje zamówienie, a powiązane podmioty nie są zwracane w żadnej określonej kolejności –

Odpowiedz

0

Wygląda na to, że twój LazyLoading działa, gdy twój dbContext jest zamknięty. Więc nie załaduje się. Używasz ContactPerson w widoku, mam rację?

+0

Tak, mam dostęp do klubu w widoku (klub) metody wyświetlania. Ale próbowałem uzyskać dostęp do osoby kontaktowej przed linią "return view (club") i to było to samo. Próbowałem również uzyskać dostęp do osoby kontaktowej, gdy otrzymam klub w projekcie DB i nie został załadowany. – user1780105

+0

Kiedy używam debuggera, typ ContactPerson nie jest zmieniany. Pamiętam mgliście, że EF tworzy nowy typ i wstawia hak do funkcji gettera. Wygląda na to, że EF w ogóle nie tworzy obiektów proxy, a więc leniwy ładowanie kończy się niepowodzeniem. W moim kodzie są następujące linie: this.Configuration.LazyLoadingEnabled = true; this.Configuration.ProxyCreationEnabled = true; – user1780105

0

Czy zapomniałeś podać klucz obcy w swoim podmiocie?

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

Może znajdziesz wyjaśnienia na temat leniwy załadunku na te dwa linki:

ten pokazuje jak ustawić leniwy załadunku z virtual hasła http://social.msdn.microsoft.com/Forums/en-US/2fa08c8f-b8c4-475f-8834-d6c903463ede/disable-lazy-loading-for-navigation-properties-on-entities-in-ef-5

to pokazuje przykład używając leniwy załadunku http://blog.staticvoid.co.nz/2012/7/17/entity_framework-navigation_property_basics_with_code_first

+0

1 przejdź na dół, ponieważ twój pierwszy link to link do dokumentacji Microsoft. inny downvote, ponieważ twój drugi link nie pokazuje nic o leniwym ładowaniu – user275801

Powiązane problemy