2012-01-20 48 views
1

反正有沒有對象有一個ID一般比較對象之間的平等?實體框架:沒有Id的通用比較類型?

我試圖做一個典型的通用的更新,這是我在網上看到很多例子,但他們都通常是這個樣子:

public void Update(TClass entity) 
{ 
    TClass oldEntity = _context.Set<TClass>().Find(entity.Id); 
    foreach (var prop in typeof(TClass).GetProperties()) 
    { 
     prop.SetValue(oldEntity, prop.GetValue(entity, null), null); 
    } 
} 

什麼similar.The問題,我的系統是並非每個類都有一個名爲Id的屬性,具體取決於類可以是ClassnameId。那麼,無論如何,我可以通過LINQ檢查是否存在並返回這樣的實體,而無需一般提供任何屬性?

回答

1

嘗試

public void Update(TClass entity) 
{ 
    var oldEntry = _context.Entry<TClass>(oldEntity); 

    if (oldEntry.State == EntityState.Detached) 
    { 
     _context.Set<TClass>().Attach(oldEntity); 
    } 

    oldEntry.CurrentValues.SetValues(entity); 
    oldEntry.State = EntityState.Modified; 
} 
+0

Thannks,從我讀,雖然更新值僅更新複雜和標量屬性,但不能導航性能?那麼這是否意味着如果我有一個擁有一組組的集合並刪除一個組並更新的用戶,則該更改將不適用於CurrentValues.SetValues?還是僅僅意味着我無法通過用戶對象上的此方法更改和更新實際組對象? http://stackoverflow.com/questions/6974660/entity-framework-generic-repository。你的代碼中還有拼寫錯誤嗎?似乎Entry應該以實體爲參數,並且如果我剛剛從db中獲取它,它會被分離出來嗎? – SventoryMang

+0

@DOTang你對導航屬性是正確的。一般的更新方法不適用於所有情況。我沒有編譯上面的代碼。所以可能有錯別字 – Eranga

+0

@Erange Thanks Eranga,但是請你澄清一下這是什麼意思,如果我有一個用戶對象和一個ICollection組。這是否意味着a)如果我從特定用戶的集合中刪除組並更新用戶,刪除的組更改將不會被保存,或b)這意味着如果我嘗試更改實際的組對象(比如說我更改名稱屬性)從集合中,並更新用戶,組對象的更改將不會保存? – SventoryMang