2012-09-24 11 views
5

我使用實體框架4.3.1從ASP .NET MVC 3.0 Web應用程序和我的代碼做一點上脫落下來的舊對象,並用新的對象,看起來像這樣替換它:實體框架中的「The RelationshipManager不能由此RelationshipManager返回」異常的根本原因是什麼?

public void UpdateUnattached(T entryToUpdate, T updatedEntry) 
{ 
    var ctx = (EntityFrameworkContext) _context;   
    ctx.ChangeObjectState(EntityState.Detached, entryToUpdate); 
    _set.Attach(updatedEntry);  
    ctx.ChangeObjectState(EntityState.Modified, updatedEntry); 
} 

除了在_set.Attach行上發現異常的情況之外,此功能始終有效。

此關係管理器無法返回RelatedEnd。 RelatedManager只能由RelationshipManager返回ObjectStateManager跟蹤的對象或實現IEntityWithRelationships的對象。

對象圖很深,我認爲它告訴我有一個屬性已被設置爲某個對象沒有被跟蹤到某處(請糾正我,如果我錯了)。所以,我的問題是...

如何找出這個異常的根本原因是什麼?

我試過在它周圍試一試,並在catch中調用GetValidationErrors,但是它也拋出異常。從異常

的更多信息(InnerException爲空)...

Type: System.InvalidOperationException 
Source: System.Data.Entity 
Target site: GetRelatedEndInternal 
Stacktrace: at System.Data.Objects.DataClasses.RelationshipManager.GetRelatedEndInternal(String relationshipName, String targetRoleName) 
at System.Data.Objects.EntityEntry.FindRelatedEntityKeysByForeignKeys(Dictionary`2& relatedEntities, Boolean useOriginalValues) 
at System.Data.Objects.EntityEntry.TakeSnapshotOfForeignKeys() 
at System.Data.Objects.ObjectStateManager.PromoteKeyEntryInitialization(EntityEntry keyEntry, IEntityWrapper wrappedEntity, IExtendedDataRecord shadowValues, Boolean replacingEntry) 
at System.Data.Objects.ObjectContext.AttachSingleObject(IEntityWrapper wrappedEntity, EntitySet entitySet, String argumentName) 
at System.Data.Objects.ObjectContext.AttachTo(String entitySetName, Object entity) 
at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName) 
at System.Data.Entity.Internal.Linq.InternalSet`1.Attach(Object entity) 
at System.Data.Entity.DbSet`1.Attach(TEntity entity) 
at ... snip ... 
+0

難道你不應該用附加實體的值更新附加實體,而不是試圖交換它們嗎?你似乎削減了一些協會。 –

+0

謝謝,是的 - 有趣的是,如果我完全按照您的說法進行操作(將entryToUpdate的每個屬性設置爲updatedEntry,然後保存而不是附加)即可使用。然而,我想知道的是,爲什麼附件不起作用,並且知道我想知道如何找出這個異常的根本原因。當然,因爲它拋出了例外框架必須知道 - 我只是希望它告訴我。 – kmp

+0

我認爲這是導致問題的分離。我從異常中瞭解到,RelationshipManager嘗試解析不再跟蹤的對象的關聯。 –

回答

0

這是不是一個實際的解決方案更多的變通......

我已經能夠確定該問題與屬性是集合有關。我懷疑Linq可能試圖填充空集合。

檢查有問題的對象,我發現我可以解決這個問題是這樣的:

舊代碼:

var myObject = db.MyObjectCollection.Find(x=>x.id = myId); 

新代碼

var myCollection = db.MyObjectCollection.Where(x=>x.id = myId); 
if(myCollection != null && myCollection.Count() > 0){ 
    var myObject = myCollection.First(); 
} 

這解決了錯誤。然而,這個解決方案的問題在於它只能解決單個案例中引發錯誤的問題,並且不能保證它不會在其他地方出現。事實上,它有點像玩Whack-Em-All,因爲在其他情況下錯誤再次出現。

0

從查看錯誤消息我猜你試圖附加一些與ObjectStateManager沒有跟蹤的其他對象(即可能不是實體)有關係的東西。

相關問題