EF代码优先 - 多对多

时间:2013-11-19 21:24:55

标签: c#-4.0 ef-code-first entity-framework-5

我首先要在代码中设计多对多的关系。 EF正在创建Junction表并按照我的预期关联Fk,但是当我尝试访问User的MailingList集合时,没有条目。

我已经通过Seeding在Initialise上实现了测试数据,数据存在于数据库中。

我认为问题在于用户和邮件列表的构造函数,但我不确定。我希望能够导航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 个答案:

答案 0 :(得分:1)

您既不急于在查询中加载MailingList条目,也不会满足延迟加载代理的要求,因此EF无法填充集合。

要允许延迟加载,请将MailingList属性更改为虚拟,以允许EF代理覆盖它。

要使用预先加载,请在查询中使用Include()System.Data.Entity中的扩展方法)来指定应加载MailingList