2011-10-18 135 views
1

我有一個問題,我認爲很容易解決。 這是我的場景(實體框架4斷開實體使用自我跟蹤)。 比方說,我有2個實體:用戶,訂單。 從一個asp.net頁面獲取數據庫1個用戶和1個訂單。更新與實體框架自我跟蹤實體

const int userId = 1; 
const int orderId = 1; 
var userManager = new UserManager(); 
var orderManager = new OrderManager(); 
var user = userManager.GetUser(userId); 
var order = channelManager.GetChannel(channelId); 

user.Orders.Add(order); 

現在我需要創建一個函數來更新用戶添加順序。

我寫的是這樣的:

public bool UpdateUser(User user) 
{ 
    context.AttachTo("Users", user); 

    var stateMgr = context.ObjectStateManager; 
    var stateEntry = stateMgr.GetObjectStateEntry(user); 

    for (int i = 0; i < stateEntry.CurrentValues.FieldCount; i++) 
    { 
      bool isKey = false; 

      string name = stateEntry.CurrentValues.GetName(i); 

      foreach (var keyPair in stateEntry.EntityKey.EntityKeyValues) 
      { 
        if (string.Compare(name, keyPair.Key, true) == 0) 
        { 
          isKey = true; 
          break; 
        } 
      } 
      if (!isKey) 
      { 
        stateEntry.SetModifiedProperty(name); 
      } 
    } 

    context.ApplyCurrentValues("Users", user); 

    return context.SaveChanges() > 0; 
} 

我沒有這個功能的任何錯誤和調試一切似乎是確定,但是當我檢查數據庫沒有更新實體如預期。 我認爲更新一個斷開的實體是一件簡單的事情,但顯然不是。 有人可以解釋我更新與EF4斷開對象的整個圖形之間的邏輯嗎?請如果您能我需要undestand邏輯並且沒有收集的鏈接看。我已經花了一些時間在互聯網上看,但我發現這麼多的批評,我不知道哪一個是正確的。

謝謝

回答

1

我沒有看到任何與您的代碼中的自我跟蹤實體相關的任何內容。無論如何,ASP.NET與ASP.NET don't work very well

你的代碼應該做什麼?它看起來像你想這樣做:

public bool UpdateUser(User user) 
{ 
    context.AttachTo("Users", user); 
    context.ObjectStateManager.ChangeObjectState(user, EntityState.Modified); 
    return context.SaveChanges() > 0; 
} 

will not save relations。我剛剛回答了一些關於使用分離圖的related question

0

使用自我跟蹤實體,您必須使用ApplyChanges()方法來同步上下文中的更改(而不是附加)。

applychanges將轉到圖形來更新鏈接的對象/集合。

Public Function UpdateEntity(entity As Entity) As Entity 

    Using dbContext As New EntityContext() 
     dbContext.EntitySet.ApplyChanges(entity) 
     dbContext.SaveChanges() 

     dbContext.Refresh(Objects.RefreshMode.StoreWins, entity) 
    End Using 

    Return entity 
End Function 

刷新是選項,它只是在這裏推回數據庫的最後一個值。順便說一句,刷新不會更新鏈接的對象。