实体框架 - 在实体尚未提交到数据库时添加关系

时间:2013-02-04 16:14:39

标签: entity-framework entity-relationship

我在两个表之间存在多对多关系: [用户] [组] (PK称为ID,这是IDENTITY coloumn)。该关系在数据库中标准化为名为 [UserGroup] 的表,其中包含两列:UserID和GroupID。

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

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

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

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

user.Groups.Add(group);

即使刚刚创建了组和用户对象并且还没有为其分配数据库密钥,EF也会通过使用新生成的用户创建 [UserGroup] 行来表达这种关系。 SaveChanges()上的.ID和group.ID值。

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

我最接近的是:

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

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

1 个答案:

答案 0 :(得分: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>)。