0

3 つのテーブルを持つ Entity Framework モデルがあります (それぞれに ID の主キーがあります)。ルート テーブルは子テーブルに対して 1 対多の関係を持ち、その子テーブルはその子テーブルと 1 対多の関係を持ちます。このモデルは、データベースから生成されたモデルに正しく反映されます。

コードでは、親テーブルに挿入 (追加) を行い、次にその子のテーブルを挿入し、最後に子の子に挿入します。コードは次の例のようになります。

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; }
}

子エンティティを親の Children コレクションに追加する限り、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 に答える