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
。
编辑
另一个例子是在这里(填充新实体的外键属性,然后在新实体插入到数据库之后,导航属性被延迟加载): 插入后的延迟加载属性