我正在使用AutoMapper
並嘗試使用AutoMapper.Collection.EntityFramework
,特別是Persist<T>
方法。AutoMapper.Collection.EntityFramework在Persist.InsertOrUpdate後導致InvalidOperationException
我的「源」是一個相當大的對象圖,已被轉換(由AutoMapper
)轉換爲一些EntityFramework
實體。父實體稱爲Log
。
在我的實驗測試,我做了以下內容:
var mapper = collectionConfig.CreateMapper();
var persistence = dbContext.Logs.Persist(mapper);
var testLog = logs.First(); // "logs" is the output of an AutoMapper.Map of a collection.
persistence.InsertOrUpdate<Log>(testLog);
Assert.IsTrue(dbContext.ChangeTracker.HasChanges());
什麼情況是在ChangeTracker.HasChanges
調用異常:
System.InvalidOperationException:該物業 'ID' 是的一部分 對象的關鍵信息,不能修改。
堆棧跟蹤爲:
System.Data.Entity.Core.Objects.EntityEntry.DetectChangesInProperty(的Int32 序,布爾detectOnlyComplexProperties,布爾detectOnly)
在 System.Data.Entity的在在 System.Data.Entity.Core.Objects.ObjectStateManager.DetectChangesInScalarAndComplexProperties(IList`1 條目).Core.Objects.EntityEntry.DetectChangesInProperties(布爾 detectOnlyComplexProperties) System.Data.Entity.Core.Objects.ObjectStateManager.DetectChanges()
在System.Data.Entity.Core.Objects.ObjectContext.DetectChanges()在 System.Data.Entity.Internal.InternalContext.DetectChanges(布爾 力)在 System.Data.Entity.Infrastructure.DbChangeTracker.HasChanges()
這是一個相當知名的和證據充分的情況例外:當你有一個現有的EntityFramework
實體對象,並試圖改變它發生其主要關鍵屬性字段之一的值。
但我不這樣做的任何地方。
我從來沒有在我的代碼設置的Id
值。 (爲Id
屬性的值來自其他地方,由AutoMapper
創建Log
對象的名單時因爲我有理由相信,對於testLog
對象的條目確實已經存在於數據庫中的數據的性質。 )
我已經能夠,拯救整個集合Log
項,通過創建AutoMapper
的數據庫,通過EF
,所以我不認爲我的Log
實體或對象圖有問題。我認爲這是AutoMapper.Collection.EntityFramework
某種程度上在做的事情。
我曾嘗試Persist
方法有不同的,更簡單的實體,與衆多較少的子實體,並沒有這個問題。但是我甚至無法從這個錯誤中知道圖中的哪個對象具有所謂的Id
值:此對象圖中的一半對象具有名爲Id
的主鍵。
我可以確認實際值的testLog.Id
沒有被InsertOrUpdate
更改。但我試圖檢查Entry<Log>
的testLog
甚至看dbContext.Logs.Local
都會導致拋出相同的異常。
所以:任何人有一個想法,爲什麼發生這種情況?