web-dev-qa-db-ja.com

DbSet.CreateとnewEntity()の影響

DbSet.Createを使用するのか、単にエンティティを新しくして追加するのかについて少し混乱しています。 DbSet.Createを使用した場合の影響をよく理解していません。

該当する場合、DbSet.Createがプロキシバージョンを作成することは理解していますが、それが何を意味するのかはよくわかりません。なぜ気にするのですか?遅延読み込みに関連するエンティティがないため、空のプロキシクラスは非プロキシクラスよりも有用ではないように思われます。

明らかな違いを超えて、違いを教えていただけますか?そして、なぜあなたは気にしますか?

52

DbSet<T>.Create()を使用することが理にかなっているシナリオは、既存のエンティティをコンテキストにアタッチしてから、関連するエンティティの遅延読み込みを活用することです。例:

_public class Parent
{
    public int Id { get; set; }
    public virtual ICollection<Child> Children { get; set; }
}

public class Child
{
    public int Id { get; set; }
    public string Name { get; set; }
}
_

その場合、以下が機能します。

_using (var context = new MyDbContext())
{
    var parent = context.Parents.Create();
    parent.Id = 1; // assuming it exists in the DB
    context.Parents.Attach(parent);

    foreach (var child in parent.Children)
    {
        var name = child.Name;
        // ...
    }
}
_

ここで、子の遅延読み込みがトリガーされます(おそらく、空のコレクションが生成されますが、nullはトリガーされません)。 context.Parents.Create()new Parent()に置き換えると、_parent.Children_は常にnullであるため、foreachループがクラッシュします。

編集

別の例はここにあります(新しいエンティティの外部キープロパティを入力し、新しいエンティティがDBに挿入された後にナビゲーションプロパティを遅延ロードする): 挿入後の遅延ロードプロパティ

54
Slauma