【问题标题】:Entity Framework - adding relationships when entities have not yet committed to the databse实体框架 - 在实体尚未提交到数据库时添加关系
【发布时间】:2013-02-05 06:44:17
【问题描述】:

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

到目前为止,EF 模型(使用 Database First)对 [UserGroup] 表进行了抽象,并没有显示为显式表。

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

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

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

user.Groups.Add(group);

即使组和用户对象刚刚创建并且尚未分配数据库键,EF 也会通过与新生成的用户创建 [UserGroup] 行来尊重这种关系SaveChanges() 上的 .ID 和 group.ID 值。

现在 [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。 任何人都可以就此提出建议。谢谢。

【问题讨论】:

    标签: entity-framework entity-relationship


    【解决方案1】:

    您应该向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>) 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-26
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多