更新时实体框架上升错误

时间:2013-06-28 08:13:13

标签: c# entity-framework

在实体框架中更新实体的属性后,我收到错误

  

该物业' Id'是对象关键信息的一部分,不能修改。

现在有了一些谷歌foo我开始谷歌这个问题,但我找到的每个答案确实与代码实际上试图改变实体的Id属性有关。

我很清楚我不允许这样做,因此我的代码并没有尝试这样做。 我仍然得到错误。 所讨论的所有代码都是从DB中读取一个实体,然后将布尔值从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扔出窗外。

修改

根据要求_requestRepository.SaveToken()方法以及底层UoW Save()

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 添加了Stacktrace

   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

编辑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);
            }
        }

1 个答案:

答案 0 :(得分:2)

我唯一能想到的是ConsumeRequestToken中的上下文和Save Method中的上下文是不同的'context'和/或是上下文的不同'实例'