2010-08-01 85 views
2

这是使用自追踪实体添加/更新实体的方法,使用POCO的等效方法是什么?实体框架4 POCO如何更新实体?

 public Hero SaveHero(Hero hero) 
     { 
      using (WarEntities model = new WarEntities()) 
      { 
       if (hero.ChangeTracker.State == ObjectState.Added) 
       { 
        model.Heroes.AddObject(hero); 
        model.SaveChanges(); 
        hero.AcceptChanges(); 
        return hero; 
       } 
       else if (hero.ChangeTracker.State == ObjectState.Modified) 
       { 
        model.Heroes.ApplyChanges(hero); 
        model.SaveChanges(); 
        return hero; 
       } 
       else 
        return null; 
      } 
     } 

回答

4

的最直接方式更新实体法为ID取水的时候,重写所有属性和调用SaveChanges()

public Hero SaveHero(Hero hero) 
{ 
    using (WarEntities model = new WarEntities()) 
    { 
     Hero dbHero = model.Heroes.FirstOrDefault(h => h.Id == hero.Id); 
     if (dbHero != null) 
     { 
      dbHero.Name = hero.Name; 
      dbHero.OtherProperties = hero.OtherProperties; 
      ... 
      model.SaveChanges(); 
      return dbHero; 
     } 
     else 
     { 
      model.Heroes.AddObject(hero); 
      model.SaveChanges(); 
      return hero; 
     } 
    } 

然而,就可以避免通过将获取从DB实体在POCO实体,并改变其状态Modified

public Hero SaveHero(Hero hero) 
{ 
    using (WarEntities model = new WarEntities()) 
    { 
     model.Heroes.Attach(hero); 
     var heroEntry = model.ObjectStateManager.GetObjectStateEntry(hero); 
     heroEntry.ChangeState(EntityState.Modified); 
     model.SaveChanges(); 
     return hero; 
    } 

请注意,如果你已经在T这个“英雄”这个方法才有效他DB和正在更新现有的条目。你需要一个单独的方法来添加一个新的“英雄”。

+0

当您使用第二个选项(更改实体的ObjectState)时,ObjectContext如何知道实体的哪些属性实际上已被更改?我猜想生成的SQL命令是一个UPDATE语句,它只包含所有数据库列。那是对的吗?如果是这样,更新可能不如按属性更改属性(您的第一个选项),其中更改跟踪会通知哪些属性发生了真正更改并生成更高效的UPDATE语句。我不确定我是否正确解释了这两种方案的优点和缺点。 – Slauma 2010-08-08 21:37:27

+0

是的,你是正确的,第二个选项将更新所有属性。不过,我认为第一个版本的性能增益不会很明显,但是(除非您使用大量数据进行大量批量更新)。 – Yakimych 2010-08-09 07:39:03