DbContext.Add和DbContext.AddObject之间的区别是什么?

14

我是WPF的初学者。我想知道dbcontext.Adddbcontext.AddObject之间的区别。

private void AddButton_Click(object sender, RoutedEventArgs e)
{
        Name employee = new Name();
        employee.Name1 = "Test";
        dataContext.Names.AddObject(employee);
}

我想要实现这个dbcontext.AddObject(),但是我遇到了一个错误:

'System.Data.Entity.DbSet' 不包含 'AddObject' 的定义,并且找不到任何接受类型为 'System.Data.Entity.DbSet' 的第一个参数的扩展方法 'AddObject'(您是否缺少使用指令或程序集引用?) C:\Documents\Visual Studio 2012\Projects\WpfApplication9\WpfApplication9\MainWindow.xaml.cs 49 31 WpfApplication9

并且请问哪一个更好。谢谢。


1
这与WPF无关,而是与Entity Framework有关。 - shahkalpesh
3个回答

16
实际上,您正在讨论旧的ObjectSet类中使用的AddObject方法,该方法由旧的ObjectContext使用。但是,自Entity Framework 4以来,我们有了DbContext类(它是对旧的ObjectContext的包装器)。这个新类使用DbSet而不是旧的ObjectSet。新的set类具有Add方法。因此,回到区别。旧实现调用ObjectContext的AddObject方法:
public void AddObject(TEntity entity)
{
    Context.AddObject(FullyQualifiedEntitySetName, entity);
}

新的实现做同样的事情(参见操作参数):

public virtual void Add(object entity)
{
    ActOnSet(() => ((InternalSet<TEntity>) this).InternalContext.ObjectContext.AddObject(((InternalSet<TEntity>) this).EntitySetName, entity),  
              EntityState.Added, entity, "Add");
}

正如您所看到的,同样的ObjectContext.AddObject方法在内部被调用。改变的是-之前我们只是将实体添加到上下文中,但现在如果在ObjectStateManager中存在状态条目,则将条目的状态更改为Added

if (InternalContext.ObjectContext.ObjectStateManager.TryGetObjectStateEntry(entity, out entry))
{
    entry.ChangeState(newState); // just change state
}
else
{
    action(); // invoke ObjectContext.AddObject
}

新API的主要目标是使DbContext更易于使用。


请注意,OP遇到的问题是在DbSet<T>上调用AddObject而不是在上下文中调用。也许您可以通过调用ObjectContext.AddObject(“Names”,nameEntityToAdd)和DbContext.Names.Add(nameEntityToAdd)来展示如何同时使用两者来详细说明您的答案。 - zeebonk

1

调用 ObjectContext 上的 AddObject 方法将对象添加到对象上下文中。

当对象是数据源中尚不存在的新对象时,请执行此操作。

当您创建一个与对象上下文中的另一个对象相关联的新对象时,请使用以下方法之一添加对象: 调用 EntityCollection 上的 Add 方法并指定相关对象。


0

简而言之,它们大致相同。我发现这篇博客文章很短,重点突出:

http://blog.cincura.net/232485-someentityset-addobject-vs-addtosomeentityset-methods/

你也可以看看MSDN,但在这种特定情况下,我发现它有点晦涩。

http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.addobject.aspx

您的错误提示表明该方法不可用。我发现当您切换到新版本的Entity Framework时会出现这种情况。您需要逐个更改所有方法调用以使用Add

如果您有一些核心原因想要使用AddObject,请详细说明您的需求,以便其他人更好地帮助您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接