2010-08-01 136 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