我有一个需要多对多关系的User类和Role类。如果User有一个集合或Roles,反之亦然,我可以弄清楚如何在流畅的API中指定映射,例如(在角色映射中):
this.HasMany(t => t.Users)
.WithMany(t => t.Roles)
.Map(m =>
{
m.ToTable("UsersToRoles");
m.MapLeftKey("RoleId");
m.MapRightKey("UserId");
});
然而,虽然我确实希望User(类)拥有一组Roles,但我不希望希望Role(类)拥有一组用户,因为通常情况下,每个角色中的用户非常多 - 我不希望访问角色实例的风险可能会导致加载所有这些用户。所以有两个问题:
我有理由担心吗? (在.edmx的早期,我有记忆问题,虚假的双向关系会导致巨大的性能问题,直到被删除)?
如果是这样,如果两个类都没有集合,我如何指定多对多关系?
由于
答案 0 :(得分:4)
我是否有理由担心? (在.edmx的早期,我有记忆问题,造成了虚假的双向关系 在移除之前存在巨大的性能问题)?
如果允许延迟加载,可能存在风险。您可以从virtual
集合中删除Role.Users
修饰符,以确保永远不会延迟加载此集合,仅限于使用Include(r => r.Users)
的显式请求。你在EF 4.0中所说的“虚假的双向关系”可能与包含自动生成关系修正代码的POCO有关,这有时会导致不希望的副作用(但也主要是由于延迟加载)。
如果是这样,如果两个类都没有集合,我如何指定多对多关系?
您必须配置User
侧的多对多关系,然后使用不带lambda参数的WithMany()
:
this.HasMany(t => t.Roles)
.WithMany()
.Map(m =>
{
m.ToTable("UsersToRoles");
m.MapLeftKey("UserId");
m.MapRightKey("RoleId");
});
在这种情况下, this
是EntityTypeConfiguration<User>
。另请注意映射中“左”和“右”的反转。