2009-06-25 82 views
1

我試圖使用方法:LINQ to SQL的實體運營

// this is a BreakHistory class from the ADO.NET Data Entity Model _entities 
_entities.AddToBreakHistory(this); 
_entities.SaveChanges(); 

和我得到「一個實體對象不能被IEntityChangeTracker的多個實例的引用。」錯誤

我在想,我的更新代碼:

_entities.ApplyPropertyChanges(this.EntityKey.EntitySetName, this); 
_entities.SaveChanges(); 

,我想我可能會得到相同類型的錯誤。

我是否必須獲取原始的BreakHistory對象?

var originalBreakHistory = (from bh in _entities.BreakHistorySet where bh.BreakHistoryID = id select bh).FirstOrDefault(); 

- 更新於4:40 PM 當天看來,我可能會具有可能與另一個問題。 我將管理器實體對象添加到當前BreakHistory實體,因爲它們是相關的,並且我收到此錯誤: 「兩個對象之間的關係無法定義,因爲它們連接到不同的ObjectContext對象。」

難道那個錯誤是因爲我使用相同的實體模型,但在實體對象上調用「new」並從DB中加載它們?

下面是我的一些代碼:

protected void lstBreaks_ItemCommand(object source, RepeaterCommandEventArgs e) 
{ 
    var bh = new BreakHistory().CurrentBreakRequest(int.Parse(e.CommandArgument.ToString())).CurrentManagerIs(GetManagerEntityByUserName()); 

    switch (e.CommandName) 
    { 
     case "Approve": 
      bh.Approve(); 
      break; 
     case "Deny": 
      bh.Deny(); 
      break; 
     case "Push": 
      bh.Push(); 
      break; 
    } 

    bh.Save(); 

    LoadBreakList(); 
} 

上例中的代碼的批准 - bh.Approve()看起來是這樣的:

public BreakHistory Approve() 
{ 
    this.DateApproved = DateTime.Now; 
    this.ManagerApprove = CurrentManager; 

    return this; 
} 

經理可以批准,拒絕或推管理員通過ManagerID與BreakHistory關聯的請求。

回答

0

如果您正在檢索現有記錄,則不應該使用新的操作符。這可能是什麼掛在你身上。

確保您的所有更新都使用相同的DataContext對象。出於多種原因,很難將對象從一個DataContext移動到另一個DataContext。

+0

我還在學習Linq和整個實體模型結構。你說得對,我使用了兩個完全獨立的DataContext。 – kntcnrg 2009-06-29 12:54:07