2012-09-28 47 views
2

我有以下代碼在保存.Net 4/EF 4項目中的分離對象方面做得非常好。我想在新的.Net 4.5/EF 5項目中使用該代碼。我複製它,現在它給了我一個編譯錯誤:TryGetObjectByKey不在.net 4.5中編譯

「MyEntities不包含'TryGetObjectByKey'的定義,並且沒有擴展方法'TryGetObjectByKey'接受類型MyEntities的第一個參數可以找到(你是否缺少)使用指令或程序集引用?)「

據稱它來自System.Data.Entity程序集(.dll)中引用的System.Data.Objects命名空間(所以我有一個使用它)。

public bool UpdateChanged(IEntityWithKey DetachedObject = null) { 
    bool Result = false; 

    try { 
     using (MyEntities db = new MyEntities()) { 
      if (DetachedObject != null) { 
       object Original = null; 

       if (db.TryGetObjectByKey(DetachedObject.EntityKey, out Original)) 
        db.ApplyCurrentValues(DetachedObject.EntityKey.EntitySetName, DetachedObject); 
      } // if they want to Update an Entity 

      db.SaveChanges(); 
      Result = true; 
     } // using the database 
    } catch (Exception e) { 

    } // try-catch 

    return Result; 
} // UpdateChanged - Method 

根據這個鏈接它應該工作:http://msdn.microsoft.com/en-us/library/bb738728.aspx

能否請你幫忙嗎?

UPDATE /解決方案:

基於@羅雲的回答下面我只是修改了我的保存方法類似下面,而不是創建一個UpdateChanged方法,它有獨立的對象:

using (MyEntities db = new MyEntities()) { 
    if (o.ID > 0) { 
     // Existing Owner 
     db.Owners.Attach(o); 
     db.Entry(o).State = EntityState.Modified; 
     db.Entry(o.Address).State = EntityState.Modified; 
    } else { 
     // New Owner 
     db.Owners.Add(o); 
    } // if this is a New Owner 

    db.SaveChanges(); 
} // using the database 
+0

MyEntities是ObjectContext的一個子類嗎? –

+0

'MyEntities'('db'的類型)被看作是第一個參數,所以這看起來像是你在某處的擴展方法。 –

+0

爲了讓Brian的問題更清楚 - 是從ObjectContext或DbContext派生的MyEntities?你能展示它的外觀嗎? – Pawel

回答

4

TryGetObjectByKey是ObjectContext上的一個方法。從Visual Studio 2012開始,新模型默認會生成一個基於DbContext的上下文(DbContext被設計爲更簡單,更直觀的API表面)。除非您選擇交換到DbContext,否則現有模型將繼續生成ObjectContext。您也可以通過revert back to ObjectContext獲取新車型。

您可以使用(((IObjectContextAdapter)db).ObjectContext.TryGetObjectByKey(...)始終獲取底層ObjectContext。

+0

謝謝@Rowan,那就是訣竅。有了這個新的DbContext,有沒有更好的/不同的方式來連接斷開連接的對象? – Grandizer

相關問題