DbSet.Create与新实体()的分支

我对是否使用DbSet.Create有点困惑,或者只是简单地添加一个实体并添加它。 我真的不明白使用DbSet.Create的后果。

我知道DbSet.Create将创build一个代理版本(如果适用的话),但我不明白这意味着什么。 为什么我在乎 在我看来,一个空的Proxied类没有比非代理类更有用,因为没有相关的实体来延迟加载。

你能告诉我,除了明显的差异吗? 你为什么要关心?

使用DbSet<T>.Create()有意义的scheme是将现有实体附加到上下文,然后利用相关实体的延迟加载。 例:

 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 )。 如果你想用new Parent()replacecontext.Parents.Create() ,foreach循环将会崩溃,因为parent.Children总是为null

编辑

另一个例子是在这里(填充新实体的外键属性,然后在新实体插入到数据库之后,导航属性被延迟加载): 插入后的延迟加载属性