2011-10-18 110 views
0

我會嘗試儘可能明確:EF代碼優先:型號配置

我的目標:讀我聲明瞭車型的配置在我重寫OnModelCreatingDbContext派生我的實體類中。

原因:我的數據層,在那裏我得到哪些字段是T的主鍵上建立一個通用的方法void Update<T>(T toUpdate),檢索他們所傳遞的toUpdate對象上,並在Set<T>().Find方法使用它們。

這將允許我不處理每種類型的實體的硬編碼查找邏輯。

我需要檢索所存儲實體應用更新,就像這樣:

var retrievedItem = _entities.Set<T>().Find(myRetrievedKeyValues); 
_entities.Entry(retrievedItem).CurrentValues.SetValues(toUpdate); 

我被困在點,在我的_entities情況下(這是我的實體類當然從DbContext派生)我似乎無法找到模型配置的存儲位置。

任何人都可以將我指向正確的方向?

謝謝。

回答

1

你可以找到的代碼如何檢索實體類型YourEntity這裏的關鍵屬性名稱:

Entity Framework code first. Find primary key

,然後檢索值:

public Update<T>(T toUpdate) 
{ 
    // Code from link above with YourEntity = T 

    List<object> myRetrievedKeyValues = new List<object>(); 
    foreach (var keyName in keyNames) 
     myRetrievedKeyValues.Add(toUpdate.GetType().GetProperty(keyName) 
      .GetValue(toUpdate, null)); 

    var retrievedItem = _entities.Set<T>().Find(myRetrievedKeyValues.ToArray()); 
    _entities.Entry(retrievedItem).CurrentValues.SetValues(toUpdate); 
} 

期待您能有一個非常緩慢的Update方法,因爲你必須使用反射這種通用的方法。

另外不要忘記,CurrentValues.SetValues只會更新標量和複雜的屬性。它不會幫助您更新導航屬性。您將不得不使用非泛型代碼來更新特定於每個實體類型的關係。

+0

這很完美,我已經完全按照您發佈的內容編寫了代碼的其餘部分。奇蹟般有效。 –