ObjectContext.AddObject 和
ObjectSet.AddObject :
该 ADDOBJECT 方法是将那些新创建的对象 不 存在于数据库中。该实体将获得自动生成的临时 EntityKey
,其EntityState将设置为 Added 。调用SaveChanges时,对于EF来说很清楚,该实体需要插入数据库中。
ObjectContext.Attach 和
ObjectSet.Attach :
另一方面, Attach 用于数据库中已经 存在的 实体。Attach不会将EntityState设置为Added,而是会产生
Unchanged
EntityState,这意味着自从将它附加到上下文以来,它没有发生变化。假定要附加的对象存在于数据库中。如果在对象附加后对其进行修改,则在调用SaveChanges时,EntityKey的值将用于通过在db表中找到其匹配ID来更新(或删除)相应的行。
此外,使用Attach方法,可以定义ObjectContext中已经存在但具有 没有
自动连接。基本上,Attach的主要目的是连接已附加到ObjectContext且 不是
新实体,因此您不能使用Attach附加已添加EntityState的实体。在这种情况下,您必须使用 Add() 。
例如,假设您的Person实体具有一个名为 Addresses 的导航属性,它是 Address
实体的集合。假设您已经从上下文中读取了两个对象,但是它们彼此之间不相关,并且您想要这样做:
var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };var myAddress = ctx.Addresses.First(a => a.PersonID != existingPerson.PersonID);existingPerson.Addresses.Attach(myAddress);// OR:myAddress.PersonReference.Attach(existingPerson)ctx.SaveChanges();



