EF 6多对多导航属性null

时间:2017-12-09 12:46:50

标签: c# entity-framework-6

我已经定义了两个对象之间的多对多关系。每个对象都公开相同的Navigation属性,以便我通过代码遍历关系。设置如下;

    public class Message : Entity<int>
    {
        public int UserId { get; set; }

        public User User { get; set; }

        public Guid Reference { get; set; } = Guid.NewGuid();

        public virtual ICollection<MessageGroup> MessageGroups { get; set; } = new HashSet<MessageGroup>();
    }
}

  public class Group : Entity<int>
    {
        public int UserId { get; set; }

        public User User { get; set; }

        public Guid Reference { get; set; } = Guid.NewGuid();

        public virtual ICollection<MessageGroup> MessageGroups { get; set; } = new HashSet<MessageGroup>();

    }

 public class MessageGroup
    {
        public int MessageId { get; set; }

        public Message Message { get; set; }

        public int GroupId { get; set; }

        public Group Group { get; set; }
    }

这在我的上下文中;

   protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {

                modelBuilder.Entity<MessageGroup>()
                       .HasKey(bc => new { bc.GroupId, bc.MessageId });

                modelBuilder.Entity<MessageGroup>()
                    .HasRequired(bc => bc.Group)
                    .WithMany(b => b.MessageGroups)
                    .HasForeignKey(bc => bc.GroupId)
                    .WillCascadeOnDelete(false);

                modelBuilder.Entity<MessageGroup>()
                    .HasRequired(bc => bc.Message)
                    .WithMany(c => c.MessageGroups)
                    .HasForeignKey(bc => bc.MessageId)
                    .WillCascadeOnDelete(false);

}

但是,当我尝试加载具有多个组的消息(MessageGroup表中的记录正确)时,仅显示Messages。对于信息,我通过Messages DbSet加载这些信息。当我然后通过Groups DbSet加载组时,相反的情况发生,只显示Groups

从消息DbSet加载;

enter image description here

从DbSet组加载;

enter image description here

我可以使用MessageGroup DbSet并包含它们来获得它们;

var messageGroups = context.MessageGroups.Where(x => x.MessageId == id).Include(x => x.Group).Include(x => x.Message).ToList();

但我希望能够加载我的消息或群组并使其可用。

有关信息,我的上下文包含在另一个图层中,我已经为每个Type公开了一些方法,但最终,我正在调用;

   public T Get(U id)
        {
            return _dbSet.Find(id);
        }

1 个答案:

答案 0 :(得分:2)

加载集合导航属性时,EF导航属性fixup还会加载相应的反向导航属性。但是必须明确加载其他导航属性(渴望,显式或懒惰)。

由于您似乎依赖于延迟加载 MessageGroups集合导航属性,您应该在MessageGroup virtual中创建反向引用导航属性:< / p>

public class MessageGroup
{
    public int MessageId { get; set; }

    public virtual Message Message { get; set; }

    public int GroupId { get; set; }

    public virtual Group Group { get; set; }
}