Entity framework DbSet.Create与new Entity()的分歧

Entity framework DbSet.Create与new Entity()的分歧,entity-framework,entity-framework-4.1,Entity Framework,Entity Framework 4.1,对于是使用DbSet.Create,还是简单地新建一个实体并添加它,我有点困惑。我不太理解使用DbSet.Create的后果 我知道DbSet.Create将创建一个代理版本(如果适用),但我并不真正理解这意味着什么。我为什么在乎?在我看来,空的代理类并不比非代理类更有用,因为没有与延迟加载相关的实体 除了明显的区别,你能告诉我区别吗?您为什么会在意呢?使用DbSet.Create()有意义的场景是将现有实体附加到上下文,然后利用相关实体的延迟加载。例如: public class Parent

对于是使用DbSet.Create,还是简单地新建一个实体并添加它,我有点困惑。我不太理解使用DbSet.Create的后果

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


除了明显的区别,你能告诉我区别吗?您为什么会在意呢?

使用
DbSet.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; }
}
这里会触发子对象的延迟加载(可能会导致空集合,但不会
null
)。如果用
newparent()
替换
context.Parents.Create()
,foreach循环将崩溃,因为
Parent.Children
总是
null

编辑


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

Ahh。。我没有意识到你可以只填充一个外键id,然后让它懒洋洋地加载它,而不需要那么麻烦。如果您不想加载现有记录,而只想加载子项,我想我可以看出这是多么有用。如果“context.Parents”为空,该怎么办,我正在尝试您的案例,它似乎是可行的,但不幸的是对我来说“context.Parents”是null,因此此处生成的异常类似于YourProject.dll中发生的“System.NullReferenceException”类型的异常,但未在用户代码中处理其他信息:对象引用未设置为对象的实例。如果您有任何解决方案,请让我知道,这样我将克服,并将写在我的笔记中,以避免再次发生。
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;
        // ...
    }
}