2013-06-28 17 views
2

在實體框架更新實體的屬性實體框架上升錯誤我收到錯誤上更新

屬性「ID」是對象的關鍵信息的一部分,不能進行修改。

現在有了一些谷歌foo我開始谷歌的這個問題,但是我發現每個答案都確實與代碼實際上試圖改變實體的Id屬性有關。

我很清楚,我不允許這樣做,因此我的代碼不會嘗試去做。 仍然我收到錯誤。 所有有問題的代碼都是從數據庫讀取實體,然後將布爾值從false更新爲true,然後將其保存回來。

這是改變屬性的代碼:

public void ConsumeRequestToken(IOAuthContext requestContext) 
     { 
      if (requestContext == null) throw new ArgumentNullException("requestContext"); 

      WebApiOAuthRequestToken requestToken = GetRequestToken(requestContext); 

      UseUpRequestToken(requestContext, requestToken); 

      _requestTokenRepository.SaveToken(requestToken); 
     } 

static void UseUpRequestToken(IOAuthContext requestContext, WebApiOAuthRequestToken requestToken) 
     { 
      if (requestToken.UsedUp) 
      { 
       throw new OAuthException(requestContext, OAuthProblems.TokenRejected, 
             "The request token has already be consumed."); 
      } 

      requestToken.UsedUp = true; 
     } 

正如你看到的我是沒有辦法接觸到實體的ID。

有沒有人有任何想法,爲什麼這個錯誤發生?我非常接近放棄它並將EF從窗口扔出去。

EDIT

作爲請求的_requestRepository.SaveToken()方法以及底層UOW保存()

public void SaveToken(T token) 
     { 
      if (_unitOfWork.RepositoryFor<T>().Get(x => x.Token == token.Token).SingleOrDefault() == null) 
       _unitOfWork.RepositoryFor<T>().Insert(token); 

      _unitOfWork.Save(); 
     } 

public void Save() 
     { 
      context.SaveChanges(); 
     } 

編輯2

_unitOfWork.RepositoryFor()。插入(令牌):

public virtual void Insert(TEntity entity) 
     { 
      DbSet.Add(entity); 
     } 

編輯3 新增堆棧跟蹤

at System.Data.Objects.EntityEntry.DetectChangesInProperty(Int32 ordinal, Boolean detectOnlyComplexProperties, Boolean detectOnly) 
    at System.Data.Objects.EntityEntry.DetectChangesInProperties(Boolean detectOnlyComplexProperties) 
    at System.Data.Objects.ObjectStateManager.DetectChangesInScalarAndComplexProperties(IList`1 entries) 
    at System.Data.Objects.ObjectStateManager.DetectChanges() 
    at System.Data.Objects.ObjectContext.DetectChanges() 
    at System.Data.Entity.Internal.InternalContext.DetectChanges(Boolean force) 
    at System.Data.Entity.Internal.InternalContext.GetStateEntries(Func`2 predicate) 
    at System.Data.Entity.Internal.InternalContext.GetStateEntries() 
    at System.Data.Entity.Infrastructure.DbChangeTracker.Entries() 
    at BackendService.Models.DatabaseContext.SaveChanges() in c:\Work\Backend\Service\Models\DatabaseContext.cs:line 46 

EDIT 4 新增GetAccessToken方法

WebApiOAuthRequestToken GetRequestToken(IOAuthContext context) 
     { 
      try 
      { 
       return _requestTokenRepository.GetToken(context.Token); 
      } 
      catch (Exception exception) 
      { 
       // TODO: log exception 
       throw Error.UnknownToken(context, context.Token, exception); 
      } 
     } 
+0

對不起,要問明顯,但你有沒有嘗試在保存請求令牌之前插入一個斷點並查看Id是什麼? – bazz

+0

就像你說的,從你包含的代碼你不應該得到那個錯誤。 '_requestTokenRepository.SaveToken'做什麼? – greg84

+0

我編輯了問題以包含_requestTokenRepository.SaveToken方法。 @bazz是的我確實做到了這一點,並沒有改變ID :) – xen

回答

2

我能想到的唯一的事情是,在ConsumeRequestToken的背景和一個在保存方法是不同的「上下文」和/或上下文的不同「實例」