实体框架代理打破了Repository类

时间:2012-05-06 23:04:06

标签: entity-framework

我有一个使用Entity Framework 4和DbContext api的通用存储库。调用Update时,存储库使用工作对象单元注册实体和存储库。

当在工作单元上调用commit时,EF正在跟踪更新的实体(通常不是,因为存储库是用于ASP MVC及其模型绑定技术),类型是代理类型,并且抛出异常,因为模型中不存在该类型。然后,当EF使用代理类时,由EF跟踪实体时,PersistUpdateOf会失效。附图显示了这一点。 enter image description here

是否有解决方法不涉及禁用可跟踪或未跟踪的实体的代理。

    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;
    }

1 个答案:

答案 0 :(得分:1)

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

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