关于Entity Framework中的Attached报错相关解决方案的总结
關(guān)于Entity Framework中的Attached報錯的問題,我這里分為以下幾種類型,每種類型我都給出相應(yīng)的解決方案,希望能給大家?guī)硪恍┑膸椭?#xff0c;當(dāng)然作為讀者的您如果覺得有不同的意見或更好的方法,歡迎一起探討!
1.單個實體對象在進行改刪時出現(xiàn)Attached報錯,解決方案,請參見:
http://www.cnblogs.com/zuowj/p/4523075.html
http://www.cnblogs.com/scy251147/p/3688844.html
原理:清除context上本地緩存的與之相關(guān)聯(lián)的實體對象
2.單個實體對象在進行改刪時,其關(guān)聯(lián)的其它實體對象屬性(即:導(dǎo)航屬性)出現(xiàn)Attached報錯,解決方案,請參見:
http://www.cnblogs.com/zuowj/p/4650781.html
原理:清除context上本地緩存所有的實體對象
3.多個不同的實體對象進行改刪時,其自身出錯或其關(guān)聯(lián)的其它實體對象屬性(即:導(dǎo)航屬性)出現(xiàn)Attached報錯,解決方案,如下:
首先增加一個用于清除指定實體對象的context上本地緩存方法,如下:
public void DetachHoldingEntities(params object[] entities){var entries = context.ChangeTracker.Entries().Where(e => e.State != EntityState.Detached).ToList();if (entities == null && entities.Length <= 0) return;foreach (var entity in entities){var entry = entries.SingleOrDefault(e => GetEntityKey(e.Entity).Equals(GetEntityKey(entity)));if (entry != null && entry.Entity != null){entry.State = EntityState.Detached;}}}private EntityKey GetEntityKey(object entity){try{var entityWrapper = entity.GetType().GetField("_entityWrapper").GetValue(entity);//獲取字段_entityWrapper的值var entityWrapperType = entityWrapper.GetType();//獲取字段的類型var entityKey = entityWrapperType.GetProperty("EntityKey").GetValue(entityWrapper, null);//獲取EntityKey屬性的值return (EntityKey)entityKey;}catch{return null;}}然后在進行改刪前,調(diào)用上述清除方法清除指定的實體即可,示例代碼如下:
ctx.DetachHoldingEntities(entity.TA_CWBankAccountInfo); ctx.GetRepository<TA_CWTransferRequestInfo>().Update(entity);?當(dāng)然還有一個比較簡單的方法來避免上述錯誤,那就是:使用原生的DbContext進行增、刪操作,更改則由DbContext的自動跟蹤來進行處理,對于不是從DbContext查到的實體對象,若需要參與增刪改時,請先進行Attach操作,否則都是來自于DbContext的實體對象則不需要再進行Attach。
轉(zhuǎn)載于:https://www.cnblogs.com/zuowj/p/5088521.html
總結(jié)
以上是生活随笔為你收集整理的关于Entity Framework中的Attached报错相关解决方案的总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。