簡體   English   中英

使用Entity-Framework更新異常?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM