问题 dbcontext.Add和dbcontext.AddObject有什么区别


我是WPF的初学者。我想知道它们之间有什么区别 dbcontext.Add 和 dbcontext.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'的定义,并且没有扩展方法'AddObject'接受类型'System.Data.Entity.DbSet'的第一个参数可以找到(你是否缺少using指令)或汇编引用?)C:\ Documents \ Visual Studio 2012 \ Projects \ WpfApplication9 \ WpfApplication9 \ MainWindow.xaml.cs 49 31 WpfApplication9`

还建议哪一个更好。谢谢。


1248
2017-08-14 12:34


起源

这与WPF无关。它与实体框架有关。 - shahkalpesh


答案:


其实你在谈论 AddObject 的方法 ObjectSet<TEntity> 旧的使用的类 ObjectContext。但是,自从我们拥有实体框架4 DbContext class(这是旧的包装器 ObjectContext)。这个新课程使用 DbSet<TEntity> 而不是旧的 ObjectSet<TEntity>。新的集合类有方法 Add

所以,回到差异。调用旧实现 AddObject 的方法 ObjectContext

public void AddObject(TEntity entity)
{
    Context.AddObject(FullyQualifiedEntitySetName, entity);
}

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

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 更容易使用。


14
2017-08-14 12:38



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


在ObjectContext上调用AddObject以将对象添加到对象上下文。

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

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


1
2017-08-14 12:51





它的缺点似乎是它们大致相同。我发现这篇博文有点简短:

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有一些核心原因,那么请更详细地解释您的需求,以便有人能够更好地为您提供帮助。


0
2017-08-14 12:58