我是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`
还建议哪一个更好。谢谢。
答案 0 :(得分:14)
实际上,您正在讨论旧AddObject
使用的ObjectSet<TEntity>
类的ObjectContext
方法。但是,自实体框架4以来,我们有DbContext
类(它是旧ObjectContext
的包装器)。这个新课程使用DbSet<TEntity>
而不是旧ObjectSet<TEntity>
。新的集合类有方法Add
。
所以,回到差异。旧实现调用AddObject
的{{1}}方法:
ObjectContext
新实现做同样的事情(参见action参数):
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");
}
方法。改变了什么 - 之前我们刚刚将实体添加到上下文中,但现在如果ObjectStateManager中存在状态条目,那么我们只需将条目状态更改为ObjectContext.AddObject
:
Added
新API的主要目标是让if (InternalContext.ObjectContext.ObjectStateManager.TryGetObjectStateEntry(entity, out entry))
{
entry.ChangeState(newState); // just change state
}
else
{
action(); // invoke ObjectContext.AddObject
}
更易于使用。
答案 1 :(得分:1)
在ObjectContext上调用AddObject,将对象添加到对象上下文中。
当对象是数据源中尚不存在的新对象时执行此操作。
当您创建与对象上下文中的另一个对象相关的新对象时,请使用以下方法之一添加该对象: 在EntityCollection上调用Add方法并指定相关对象。
答案 2 :(得分: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有一些核心原因,请更详细地解释您的需求,以便有人能够更好地为您提供帮助。