2013-02-11 103 views
0

我有如下使用AttachTo附加一個更新的對象到ObjectContext的一個通用的CRUD庫:在實體Framwork不使用AttachTo工作

注:物業entitySetName供應對象被附加到的表的名稱

public virtual void Save(TModel t) 
    { 
      TModel unboxed = (TModel)t; 
      db.AttachTo(entitySetName, unboxed); 
      db.SaveChanges(); 
    } 

沒有錯誤出現,只是不保存數據。任何人都能看到爲什麼

+0

它實際上是否附加到任何東西?這是新紀錄還是更新現有?試一試,看看你是否得到例外 – CR41G14 2013-02-11 10:35:25

+0

不幸的是沒有拋出異常。這是一個已經存在於數據庫中的UPDATED OBJECT。當我斷開AttachTo語句上的代碼時,我可以看到返回的entitysetname是正確和有效的。 – Jimbo 2013-02-11 11:14:51

+0

該代碼是否適用於其他情況。 AttachTo需要一個EntitySetName和一個在COntext中成爲實體的對象。 Unbox令我困惑。爲什麼這是必要的。 AttachTo期望一個對象。你有沒有反編譯AttachTo來看看它做了什麼? – 2013-02-11 14:15:13

回答

2

AttachTo在狀態Unchanged的上下文中添加了一個實體。當您在緊接着調用SaveChanges之後沒有任何更新,因爲 - 從EF的角度來看 - 實體是「不變的」。

您需要的狀態設置爲Modified告訴EF是性質發生了變化,應寫入數據庫:

public virtual void Save(TModel t) 
{ 
     TModel unboxed = (TModel)t; 
     db.AttachTo(entitySetName, unboxed); 
     db.ObjectStateManager.ChangeObjectState(unboxed, EntityState.Modified); 
     db.SaveChanges(); 
} 
+0

謝謝 - 我現在會測試這個。感興趣的是,我的Entity Framework版本需要'db.ObjectStateManager.GetObjectStateEntry(unboxed).SetModified();'在第5行 – Jimbo 2013-02-12 06:37:09

+0

;(仍然沒有將它保存到數據庫中... – Jimbo 2013-02-12 08:28:15

1

我相信你想通過一列進行修改。你可以試試.Attach

public virtual void Save(TModel t) 
    { 
     db.SystemUserLogs.Attach(t); 
     //db.Entry(t).State = EntityState.Modified; //<--- For whole fields modifier 

     db.Entry(t).Property(x => x.entitySetName).IsModified = true; //<--- For one field modifier 
     db.SaveChanges(); 
    } 
+0

他使用的是ObjectContext,而不是'DbContext'。'entitySetName'是...呃...實體集合名稱(只是一個字符串),不是任何實體的屬性(http://msdn.microsoft.com/zh-cn/library/system。 data.objects.objectcontext.attachto(v = vs.90).aspx) – Slauma 2013-02-11 23:52:36

+0

@Slauma,也許..我錯了,因爲我沒有嘗試'ObjectContext',但'ObjectContext'的'.Attach'是什麼? ://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.attach.aspx – spajce 2013-02-11 23:59:52

+1

這是一個重載,你可以使用實體派生自「EntityObject」(而不是POCOs)。我的觀點更多的是'Entry ... Property ...',它不能與ObjectContext一起工作(有類似的東西:ObjectStateEntry.SetModifiedProperty)並且'entitySetName'不是一個屬性。 – Slauma 2013-02-12 00:06:32