我对映射以下关系感到困惑。
我有以下三个相关实体:User
、Group
、GroupUser
。
User
包含有关用户帐户的信息,group
有关组的信息,GroupUser
包含有关用户在组中的成员身份的信息.
public class User
{
List<GroupUser> Groups { get; set; }
}
public class Group
{
List<GroupUser> Users { get; set; }
}
public class GroupUser
{
Group Group { get; set; }
User User { get; set; }
string Position { get; set; }
DateTime Joined { get; set; }
}
我在 User
组中创建了一个单边映射:
HasMany(x => x.Groups)
.WithMany()
.Map(m =>
{
m.ToTable("UserGroups");
m.MapLeftKey("UserId");
m.MapRightKey("GroupId");
});
但是,当我尝试在 Group
HasMany(x => x.Users)
.WithMany()
.Map(m =>
{
m.ToTable("UserGroups");
m.MapLeftKey("GroupId");
m.MapRightKey("UserId");
});
我收到以下错误:
Schema specified is not valid. Errors:
(274,6) : error 0019: The EntitySet 'UserUserGroup' with schema 'dbo' and table 'UserGroups' was already defined. Each EntitySet must refer to a unique schema and table.
我想重用两个实体之间的映射表,我该怎么做?
最佳答案
您使用的映射适用于联结表 (UserGroups
) 不是概念(类)模型的一部分的情况。在这样的情况下User
应该有一个 List<Group>
和 Group
应该有一个 List<User>
. (旁注:建议使用 ICollection<>
)。
但是你有 class GroupUser
在你的模型中,所以它已经被映射(显然你将它映射到其他地方的 UserGroups
)。
在您的情况下,将联结表拉入概念模型是合理的,因为它不仅包含与其连接的表的两个 FK。代价是您无法为多对多关联建模。
如果你想得到Group
User
的小号你必须使用像
var groups = context.Users.Where(u => u.UserId == 1)
.SelectMany(u => u.Groups)
.Select(ug => ug.Group)
关于entity-framework - 不确定如何映射多对多关系 - 重用不同实体的映射表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17160138/