1

我在两个表之间有一个多对多的关系:[User][Group](PK 被称为 ID,它是一个 IDENTITY 列)。该关系在数据库中被规范化为一个名为[UserGroup]的表,其中包含两列:UserID 和 GroupID。

到目前为止,EF 模型(使用数据库优先)对[UserGroup]表进行了抽象,它并未显示为显式表。

我现在应该指出,[User][Group]表还包含一个 OrganisationID 列,并且所有用户和组(及其关系)都驻留在特定的组织中)

我现在需要将 OrganisationID 字段添加到[UserGroup]以提高数据库的性能(以便[UserGroup]按 OrganisationID 进行聚类)。因此,在从数据库执行刷新后,[UserGroup]现在显示为一个不同的实体,它破坏了我用来将用户分配到组的现有 C# 代码。

以前,如果我必须创建一个组并将其分配给用户,我会使用:

user.Groups.Add(group);

即使组和用户对象刚刚创建并且尚未为其分配数据库键,EF 通过在SaveChanges ( )。

现在[UserGroup]作为 EF 模型中的显式表存在,此代码不起作用(原因:还必须显式添加 OrganisationID)但我不知道如何创建[UserGroup]对象并将其与将其链接到新创建的[User][Group]行。

我得到的最接近的是:

GroupUser gu = new GroupUser { GroupID = group.ID, OrganisationID = nOrganisationID, UserID = u.ID };
u.GroupUsers.Add( gu );

...但它不会起作用,因为 user.ID 和 group.ID 仍然是 0。任何人都可以就此提出建议。谢谢。

4

1 回答 1

2

您应该将两个导航属性添加到UserGroup

public virtual Group Group { get; set; }
public virtual User User { get; set; }

并使用新的组和用户设置它们。EF 将找出插入数据的正确顺序并及时设置原始外键值。

您可以将其映射为

HasRequired(p => p.Group).WithMany().HasForeignKey(p => p.GroupId);

在一个UserGroupMapping班级 ( EntityTypeConfiguration<UserGroup>)。

于 2013-02-04T22:44:17.060 回答