[英]Update Exception with Entity-Framework?
嗨,
我在我的ASP.NET MVC網站上使用EntityFramework但是在更新時遇到了一些問題。
這是我的更新代碼的樣子:
using (BissEntities context = new BissEntities())
{
if (adCategoryFilter.Id < 1)
context.AddToAdCategoryFilter(adCategoryFilter);
else
context.Refresh(System.Data.Objects.RefreshMode.ClientWins, adCategoryFilter);
if (context.SaveChanges() > 0)
return true;
}
return false;
執行context.Refresh時,我得到以下異常:
要刷新的對象集合中索引0處的元素具有null EntityKey屬性值,或者未附加到此ObjectStateManager。
Stacktrace : at System.Data.Objects.ObjectContext.RefreshCheck(Dictionary`2 entities, Object entity, EntityKey key)
at System.Data.Objects.ObjectContext.AddRefreshKey(Object entityLike, Dictionary`2 entities, Dictionary`2 currentKeys)
at System.Data.Objects.ObjectContext.RefreshEntities(RefreshMode refreshMode, IEnumerable collection)
at System.Data.Objects.ObjectContext.Refresh(RefreshMode refreshMode, Object entity)
at Biss.Models.FilterModel.UpdateCategoryFilter(AdCategoryFilter adCategoryFilter) in C:\Users\Snowman\Documents\Visual Studio 2010\Projects\Biss\Biss\Models\FilterModel.cs:line 86
這不是我第一次遇到這個問題。 首先,我認為它可能與數據庫中的關系有關,但在從受影響的表中刪除之后,仍然存在相同的異常。
adCategoryFilter來自哪里?
adCategoryFilter是instansiated(新),然后填充ViewObject(來自網站)的數據。 它確實具有所需的數據,如過濾器ID(將過濾器映射到db中的正確行)。
請求解釋為什么我會遇到這個問題以及如何解決它。
最好的祝福
因為您使用的是ASP.NET MVC,所以您在無狀態環境中工作。 這意味着,一旦請求完成處理,就不再有“實體框架內存”或“圖形”。
因此,您需要明確告訴EF您希望添加或更新。
這是你如何做到的:
using (BissEntities context = new BissEntities())
{
if (adCategoryFilter.Id < 1)
context.AdCategoryFilters.AddObject(adCategoryFilter);
else {
var stub = new AdCategoryFilters { Id = adCategoryFilter.Id };
context.AdCategoryFilters.Attach(stub);
context.AdCategoryFilters.ApplyCurrentValues(adCategoryFilter);
}
context.SaveChanges();
}
這被稱為存根技術。
簡而言之,您創建一個新實體,其實體鍵與您嘗試更新的實體相同(在您的情況下,實體鍵是“Id”)。
然后,您“附加”此存根(因此它由EF內部圖表跟蹤),然后覆蓋此存根上的值,並將您的實體更新為UPDATE,然后保存更改。
我不能使用UpdateModel ,因為我有一個多層架構並使用POCO,自定義視圖模型等 - 所以我在我的服務/存儲庫上創建了一個自定義的“UpdateModel”方法 - 它做了一個(更復雜的)版本的以上。
也嘗試不使用“如果Id <1,它是一個添加”與ASP.NET MVC - 好像你忘了綁定視圖上的ID,它將被傳遞為0,所以即使你可以做一個更新 ,您的上述代碼將嘗試添加 。
而是更明確 - 為添加/更新提供單獨的操作方法。
HTH。
而不是刷新,嘗試使用類似自動映射器(或MVC控制器中的UpdateModel)之類的東西檢索對象並更新其屬性
EntityKey是id屬性的一個獨立的東西,其他一些東西在幕后進行。 你新創建的對象缺少這個問題,這就是問題所在。
模式有點像(不是C#家伙所以請原諒語法):
var context = new MyEntities();
var originalObject = context.MyObjectSet.Single(x => x.Id == viewmodel.Id);
UpdateModel(originalObject);
context.SaveChanges();
關鍵的區別在於新檢索的對象已正確設置了EntityKey。 您可以有效地使用id屬性來檢測新的/現有對象,但EntityKey不僅僅是該屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.