0

我有一个 Entity Framework 模型,它有 3 个表(每个表都有 indentity 主键)。根表与子表具有一对多的关系,该子表与其子表具有一对多的关系。该模型正确地反映在从数据库生成的模型中。

在代码中,我们在父表中插入(添加),然后插入子表,最后插入子表。代码类似于下面的示例:

foreach(var parentItemDTO in someDTOCollection) {
    foreach(var someChildDTOItem in someChildDTOCollection) {
        // Do some mapping here to the childEntity from DTO
        // The foreign key relationship isn't set during mapping.

        childTable.Insert(childEntity); // Underlying code is _dbSet.Add(entity)

        foreach(var someChildChildDTOItem in someDTOChildChildCollection) {
            // Do some mapping here to childChildEntity from DTO
            // The foreign key relationship isn't set during mapping.

            childChildTable.Insert(childChildEntity);   // Underlying code is _dbSet.Add(entity)
        } 
    }

    // Do mapping here of the parentEntity from DTO

    parentTable.Insert(someEntity);  // Underlying code is _dbSet.Add(entity)
}

插入数据库似乎正在工作。但是,我想了解的是,在没有我在映射期间明确定义外键关系的情况下,EF 如何维护这些对象的关系?这些插入范围安全吗?这会导致孤儿或孩子被插入错误的父母(现在我们没有看到这种情况发生,但它有可能)吗?

谢谢!

编辑(更正):

代码已更新以反映父插入发生在所有子插入之后。

4

1 回答 1

1

要让 EF 正确跟踪实体,您需要具有表示实体之间关系的属性。您的父实体应该有一个引用子级的属性,而子级又应该有引用其子级的属性。例如:

class ParentEntity {
    public int Id { get; set; }
    public ICollection<ChildEntity> Children { get; set; }
}

class ChildEntity { 
    public int Id { get; set; }
}

只要将子实体添加到父子集合中,EF 就可以跟踪关系:

var parent = new ParentEntity();
parent.Children.Add(new ChildEntity());
parent.Children.Add(new ChildEntity());

EF 知道 parent.Children 集合中的对象引用表示新实体(未附加到上下文的实体)并将相应地处理它们。在调用 SaveChanges() 之前,不会发生对数据库的实际插入。当您将对象添加到 DbSet 时,EF 刚刚开始在内存中跟踪它。只有当您调用 SaveChanges() 时,实体才会被写入数据库。此时 EF 会发现需要先保存父实体。然后它将在您的子实体中使用父实体的 PK 作为 FK。现在您可以将父级添加到上下文中,这也将添加子级:

context.Set<ParentEntity>().Add(parent);
context.SaveChanges(); // adds parent and two children.
于 2012-09-24T19:40:17.023 回答