2013-11-19 3 views
0

У меня есть проблема с разработкой ко многим отношениям в коде. EF создает таблицу Junction и связывает Fk, как я ожидал бы, однако, когда я пытаюсь получить доступ к коллекции MailingList пользователя, записей нет.EF Code First - много для многих

Я внедрил тестовые данные при инициализации через Seeding, данные находятся в базе данных.

Я думаю, что проблема связана с конструкторами для пользователей и списков рассылки, но я не уверен. Я хочу, чтобы иметь возможность навигации навигационного свойства User.MailingLists.

var user = db.Users.Find(1); 

    Console.WriteLine("{0}", user.EmailAddress); //This is Fine 
    Console.WriteLine("{0}", user.Address.PostCode); /This is Fine 


    foreach (MailingList ml in user.MailingLists) // this is 0 
    { 
     Console.WriteLine("{0}", ml.Name); 
    } 

Моя модель ниже: -

public class User : IEntityBase 
    { 
     public User() 
     { 
      MailingLists = new List<MailingList>(); 
     } 

     public int Id { get; set; } 
     public string Forename { get; set; } 
     public string Surname { get; set; } 
     public string EmailAddress { get; set; } 
     public DateTime? DateLastUpdated { get; set; } 
     public DateTime DateCreated { get; set; } 
     public bool IsDeleted { get; set; } 

     public virtual Address Address { get; set; } 
     public ICollection<MailingList> MailingLists { get; set; } 

    } 

public class MailingList : IEntityBase 
    { 
     public MailingList() 
     { 
      Users = new List<User>(); 
     } 

     public int Id { get; set; } 
     public string Name { get; set; } 
     public DateTime? DateLastUpdated { get; set; } 
     public DateTime DateCreated { get; set; } 
     public bool IsDeleted { get; set; } 
     public ICollection<User> Users { get; set; } 
    } 



public class Address : IEntityBase 
    { 
     public int Id { get; set; } 
     public string AddressLine1 { get; set; } 
     public string AddressLine2 { get; set; } 
     public string AddressLine3 { get; set; } 
     public string City { get; set; } 
     public string County { get; set; } 
     public string PostCode { get; set; } 
     public DateTime? DateLastUpdated { get; set; } 
     public DateTime DateCreated { get; set; } 
     public bool IsDeleted { get; set; } 
    } 

Любые предложения приветствуются.

ответ

1

Вы не хотите загружать записи MailingList с запросом и не выполнять требования для ленивого прокси-сервера загрузки, поэтому EF не может заполнять коллекцию.

Чтобы разрешить ленивую загрузку, измените свойство MailingList на виртуальное, чтобы позволить прокси-серверу EF переопределить его.

Чтобы использовать загрузку, используйте Include() (метод расширения в System.Data.Entity) в запросе, чтобы указать, что необходимо загрузить MailingList.

+0

Спасибо, что здесь предпочтительный метод? Является ли загруженная загрузка менее экспансивной? – Derek

+1

Если вы уверены, что вам понадобятся данные, загрузка будет лучше, так как она загрузит все в одном вызове в БД. Lazy loading лучше, если вы не знаете, какие данные вам понадобятся. Это также удобно для случаев, когда производительность не является проблемой. –

+0

Итак, с нетерпением-загрузкой я могу работать на том основании, что мои вызовы будут получать только то, что мне нужно от определенного объекта, если я имею в виду то, что ищу. Если мне нужно захватить все данные, относящиеся к объекту, ленивая загрузка будет тянуть во всем? – Derek

Смежные вопросы