0

我有一个通用存储库,它使用带有 DbContext api 的实体框架 4。调用 Update 时,存储库将实体和存储库注册到工作单元对象。

当在工作单元上调用 commit 时,EF 正在跟踪更新的实体(通常不是,因为存储库用于 ASP MVC 及其模型绑定技术),类型是代理类型并引发异常因为模型中不存在该类型。PersistUpdateOf 然后在 EF 跟踪实体时失败,因为 EF 使用代理类。附图显示了这一点。 在此处输入图像描述

是否有不涉及禁用代理的解决方法,这些代理将与被跟踪或未跟踪的实体一起工作。

    public void Update<TEntity>(TEntity entity) where TEntity : EntityBase
    {
        //Audit the update
        if (entity is IAuditable)
        {
            (entity as IAuditable).AuditEntityUpdate();
        }

        //Register the entity as Amended with the unit of work
        _unitOfWork.RegisterAmended(entity, this);
    }


    public virtual void PersistUpdateOf(EntityBase entity)
    {
        _context.Set(entity.GetType()).Attach(entity);
        _context.Entry(entity).State = EntityState.Modified;
    }
4

1 回答 1

1

只需删除您Attach实体的行。请注意,代理实体由创建它的上下文跟踪。如果您没有Detach使用它或使用它,AsNoTracking()您将无法将其附加到另一个上下文。

public virtual void PersistUpdateOf(EntityBase entity)
{
    _context.Entry(entity).State = EntityState.Modified;
}
于 2012-05-06T23:23:44.757 回答