我已经定义了两个对象之间的多对多关系。每个对象都公开相同的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加载;
从DbSet组加载;
我可以使用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);
}
答案 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; }
}